1

LAPACKルーチンを使用して、完全にパックされた長方形形式を使用した行列の因数分解と反転を行います。これは、対称nxn行列に対してn(n + 1)/2要素のみを格納する必要があるためです。これまでのところ、マトリックスを「パック」形式で設定し、ルーチンDTPTTFを呼び出して変換しています。ただし、これには2番目のアレイが必要です。完全にパックされた長方形の形式で直接行列を作成したい(スペースを節約するため)-i、j番目の要素の位置を指定する「アドレス指定」関数はありますか?または誰かが私に関連する式を教えてもらえますか?

4

1 に答える 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 に答える