CSR/CSC* マトリックスを Fortran で管理する際によくある問題についてお聞きしたいと思います。N 個の実数値を持つベクトル V があるとします。ベクトルは、特定のサイズで事前に割り当てられています。ここで、インデックス P の中央に値を追加する必要があります。ブルート フォース コードは次のようになります。
allocate(tempV(N))
tempV=V
deallocate(V)
allocate(V(N+1))
V=(/tempV(1:P-1), newValue, tempV(P:N)/)
deallocate(tempV)
明らかに、一度行えば問題ありませんが、何千回も繰り返すのはあまり効率的ではありません。メモリは、挿入したい値ごとに4回いっぱいになり、空になります。
この問題に取り組むためのより良い手順を知りたいです。プレーンな Fortran (推奨) を提案できますが、MKL/Lapack/Blas などのライブラリによるソリューションも提案できます。
補遺: RESHAPEでできますか? この定義(Fortran ブックの定義と同じ)を実行すると、次のようなことができます。
REAL, DIMENSION(1:1) :: newPad = (/ newValue /)
V=RESHAPE(V, (/ N+1 /), PAD=newPad)
V の末尾に値が追加されたので、次の順列を作成します。
V=(/ V(1:P-1), V(N+1:N+1), V(P:N) /)
このようにして、一時的なベクトルを明示的に作成して割り当てを失うことを回避できます。
RESHAPE は既にライブラリで並列化できるため、効率的でスケーラブルでしょうか?
* PS : 明確にするために、CSR = 圧縮スパース行形式、CSC = 圧縮スパース列形式、詳細はこちら: