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 / 미니 마
Reference
이 문제에 관하여(Elixir에서 행렬식 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sym_num/items/3262dd3496e875e5e377
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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 / 미니 마
Reference
이 문제에 관하여(Elixir에서 행렬식 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sym_num/items/3262dd3496e875e5e377
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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 / 미니 마
Reference
이 문제에 관하여(Elixir에서 행렬식 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sym_num/items/3262dd3496e875e5e377
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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 / 미니 마
Reference
이 문제에 관하여(Elixir에서 행렬식 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sym_num/items/3262dd3496e875e5e377
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Elixir에서 행렬식 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sym_num/items/3262dd3496e875e5e377텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)