この fortran のコードは、ラプラシアンの公式 (マイナーによる拡張) を使用して nxn 行列の行列式を計算します。このプロセスがどのように機能するかを完全に理解しています。
しかし、誰かが私に次のコードがどのように動作するかについての洞察を与えることができますか、特定の反復など。補因子。私が理解しているコードの側面がありますが、私を深く混乱させているのは再帰です。3x3 マトリックスを使用して段階的に実行しようとしましたが、役に立ちませんでした。
! Expansion of determinants using Laplace formula
recursive function determinant(matrix) result(laplace_det)
real, dimension(:,:) :: matrix
integer :: msize(2), i, n
real :: laplace_det, det
real, dimension(:,:), allocatable :: cf
msize = shape(matrix)
n = msize(1)
if (n .eq. 1) then
det = matrix(1,1)
else
det = 0
do i=1, n
allocate(cf(n-1, n-1))
cf = cofactor(matrix, i, 1)
det = det + ((-1)**(i+1))* matrix(i,1) * determinant(cf)
deallocate(cf)
end do
end if
laplace_det = det
end function determinant
function cofactor(matrix, mI, mJ)
real, dimension(:,:) :: matrix
integer :: mI, mJ
integer :: msize(2), i, j, k, l, n
real, dimension(:,:), allocatable :: cofactor
msize = shape(matrix)
n = msize(1)
allocate(cofactor(n-1, n-1))
l=0
k = 1
do i=1, n
if (i .ne. mI) then
l = 1
do j=1, n
if (j .ne. mJ) then
cofactor(k,l) = matrix(i,j)
l = l+ 1
end if
end do
k = k+ 1
end if
end do
return
end function cofactor
私が苦労している主なセクションは、これら2つの呼び出しと、それぞれの余因子計算の操作です。
cf = cofactor(matrix, i, 1)
det = det + ((-1)**(i+1))* matrix(i,1) * determinant(cf)
説明のための入力は大歓迎です(私が1回の反復の例を言ったように)。私の質問のほとんどは mathstack にあるため、これはスタックオーバーフローでの最初の投稿です (質問の数学的性質からおそらくわかるように)。プログラミングの経験はありますが、再帰の概念 (特にこの例) には頭がいっぱいです。
編集が必要な場合は、先に進んでください。スタック オーバーフローのエチケットに慣れていません。