対称正定値ブロック三重対角行列のコレスキー因数分解を行う。
対称正定値ブロック三重対角行列 (サイズ NB x NB の N の正方形ブロック) のコレスキー因数分解を行います。
最初の対角ブロックのコレスキー因数分解を行います。
N - 1 回対角線に沿って下に移動します。
三角係数の非対角ブロックを計算します。
新しく計算した非対角ブロックで対角ブロックを更新します。
対角ブロックのコレスキー因数分解を行います。
ソースコード: サンプル (https://www.intel.com/content/dam/develop/external/us/en/documents/mkl-cookbook-samples-120115.zip (英語)) の BlockTDS_SPD/source/dpbltrf.f ファイルを参照してください。GitHub の block_cholesky_decomposition (英語) も参照してください。
…
CALL DPOTRF('L', NB, D, LDD, INFO)
…
DO K=1,N-1
CALL DTRSM('R', 'L', 'T', 'N', NB, NB, 1D0, D(1,(K-1)*NB+1), LDD, B(1,(K-1)*NB+1), LDB)
CALL DSYRK('L', 'N', NB, NB, -1D0, B(1,(K-1)*NB+1), LDB, 1D0, D(1,K*NB+1), LDD)
CALL DPOTRF('L', NB, D(1,K*NB+1), LDD, INFO)
…
END DO
タスク |
ルーチン |
説明 |
---|---|---|
対角ブロックのコレスキー因数分解を行う |
DPOTRF |
対称 (エルミート) 正定値行列のコレスキー因数分解を計算します。 |
三角係数の非対角ブロックを計算する |
DTRSM |
三角行列を含む方程式を解きます。 |
対角ブロックを更新する |
DSYRK |
対称ランク-k 更新を行います。 |
対称正定値ブロック三重対角行列 (サイズ NB x NB の N の対角ブロック Di および N - 1 の 1 つ下の対角ブロック Bi) は、次のように因数分解されます。
右の行列のブロックを乗算します。
オリジナルブロック三重対角行列の要素と乗算した係数の要素を等式にします。
Ci および LiLiT を解きます。
LiLiT の方程式の右辺はコレスキー因数分解であることに注意してください。このため、次のようなコードを使用して、コレスキー因数分解を行うルーチン chol() をこの問題に利用できます。
L1=chol(D1) do i=1,N-1 Ci=Bi∙Li-T // trsm() Di + 1:=Di + 1 - Ci∙CiT // syrk() Li + 1=chol(Di + 1) end do