2

この 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 にあるため、これはスタックオーバーフローでの最初の投稿です (質問の数学的性質からおそらくわかるように)。プログラミングの経験はありますが、再帰の概念 (特にこの例) には頭がいっぱいです。

編集が必要な場合は、先に進んでください。スタック オーバーフローのエチケットに慣れていません。

4

1 に答える 1