LAPACKルーチンを使用して、完全にパックされた長方形形式を使用した行列の因数分解と反転を行います。これは、対称nxn行列に対してn(n + 1)/2要素のみを格納する必要があるためです。これまでのところ、マトリックスを「パック」形式で設定し、ルーチンDTPTTFを呼び出して変換しています。ただし、これには2番目のアレイが必要です。完全にパックされた長方形の形式で直接行列を作成したい(スペースを節約するため)-i、j番目の要素の位置を指定する「アドレス指定」関数はありますか?または誰かが私に関連する式を教えてもらえますか?
質問する
100 次
1 に答える
0
私自身の質問に部分的に答えるために: DTPTTF のソース コードとそこに示されている例を調べて、考えられる 4 つのコンスタレーションのうちの 1 つ (必要なものは 1 つだけ)、つまり uplo ='L' と trans = のアドレスを計算しました。 「ン」。以下は私のfortran関数です:
! ==================================== ! returns address for RFP format
integer function ijfprf( ii, jj, n ) ! for row jj and column ii
! ==================================== ! for UPLO = 'L' and TRANSR = 'N' only!
implicit none
integer, intent(in) :: ii, jj, n
integer :: i, j, k, n1, k1
if( ii <= jj ) then
i = ii; j = jj
else
i = jj; j = ii
end if
k = n/2
if( mod(n,2) == 0 ) then ! n even
n1 = n + 1
if( i <= k ) then
ijfprf = 1 + (i - 1) * n1 + j
else
ijfprf = ( j - k - 1 ) * n1 + i - k
end if
else ! n odd
k1 = k + 1
if( i > k1 ) then
ijfprf = ( j - k1 ) * n + i - k1
else
ijfprf = ( i - 1 ) * n + j
end if
end if
return
end function ijfprf
于 2013-02-19T22:20:20.953 に答える