Elixir에서 행렬식 계산

8068 단어 수식 처리Elixir

재활



수식 처리 시스템을 작성하고 놀고 있습니다. 제대로 한다면 Maxima나 Mathematica를 사용합니다. 만들고 있는 Minima는 오로지 내 수학 재활용입니다. (웃음) 행렬식의 코드를 쓰고 있어 빠져 버렸습니다.

행렬식



2차, 3차까지는 공식적으로 적용하면 나왔습니다. 하지만 4차 이상이 되면 공식을 사용할 수 없습니다. 여러가지 계산 방법은 있는 것 같습니다만, 학교에서 배운 소행렬을 사용하는 방법으로 Elixir로 해 보았습니다.

답합에 사용해 주신 사이트의 해설로부터 인용했습니다.


소행렬을 찾아 그것을 재귀적으로 차원을 작게 해 가서, 공식의 알고 있는 2차까지 떨어뜨립니다. 그렇다면 공식에 적용할 뿐입니다.

데이터 구조



행렬은 목록 목록으로 표현됩니다.
e.g. [[1,2],[3,4]]

부분품



i, j 위치의 작은 행렬을 구하는 함수 submatrix (m, i, j)
i,j 위치의 요소를 꺼내는 함수 elt(m,i,j)
i, j 위치에 대응하는 곱셈을 하는 부호를 구하는 함수 sign(x, m, i, j)
i, j는 수학의 전통적 기법에 따라 1 스타트의 자연수입니다.

망각의 그분



써서 계산시켜 보면 대답이 맞지 않습니다. 어라? 왜 그래?
작은 행렬은 하나의 행에 대해서만 요구하는 것이 좋았다. 죄송합니다.
디버깅하는 것 작은 시간, 대답 맞는 사이트와도 일치했습니다. 좋았어요.
Minima ver0.01
> m:matrix([1,2,3],[3,4,5],[2,5,7]);
[1,2,3]
[3,4,5]
[2,5,7]

> determinant(m);
2
>
> a:matrix([3,1,1,2],[5,1,3,4],[2,0,1,0],[1,3,2,1]);
[3,1,1,2]
[5,1,3,4]
[2,0,1,0]
[1,3,2,1]

> determinant(a);
-22
>  




코드



 def elt(m, r, c) do
    Enum.at(m, r - 1) |> Enum.at(c - 1)
  end

  def determinant1([[a,b],[c,d]]) do
    a*d - b*c
  end
  def determinant1(x) do
    size = length(x)
      for j <- 1..size do
        submatrix1(x,1,j) |> determinant1() |> sign(x,1,j)
      end
      |> Enum.sum()
  end

  def sign(x,m,i,j) do
    s = :math.pow(-1,i+j) |> round()
    s * elt(m,i,j) * x
  end

  def submatrix1([],_,_) do [] end
  def submatrix1([_|xs],1,j) do
    submatrix1(xs,0,j)
  end
  def submatrix1([x|xs],i,j) do
    [submatrix2(x,j)|submatrix1(xs,i-1,j)]
  end
  def submatrix2([],_) do [] end
  def submatrix2([_|xs],1) do
    xs
  end
  def submatrix2([x|xs],j) do
    [x|submatrix2(xs,j-1)]
  end



Minima



제 수학 재활용 수식 처리 시스템, Minima는 github에서 공개하고 있습니다.
꽤 재활이 필요합니다. (웃음)
htps : // 기주 b. 코 m / 사사가와 888 / 미니 마

좋은 웹페이지 즐겨찾기