開発者向け
本ライブラリの内部情報について少し記述しています。 改造案はウェルカムです
SparseMatについて
SparseMatの構成
疎行列SparseMatとSparseMatCは、中でSparseMatBaseD/SparseMatBaseCを疎行列の実体として持っています。 SparseMatとSparseMatCはその実体に対する操作を仲介しているだけで、実際のデータはSparseMatBaseD/SparseMatBaseCにあります。 SparseMatBaseD/SparseMatBaseCは、C++テンプレートを使ってEigenの疎行列のラッパを作っています。
SparseMatTMPL:Eigen疎行列のラッパ。mapを使って仮行列データを作成し、fixが呼ばれるとEigenの疎行列化します。これはヘッダオンリで書いてます。
SparseMatBaseD:SparseMatTMPL
のテンプレート化です。
template class SparseMatTMPL<double>;
using SparseMatBaseD = SparseMatTMPL<double>;
SparseMatBaseC:SparseMatTMPLSRLfem::dcomplexのテンプレート化です。
template class SparseMatTMPL<dcomplex>;
using SparseMatBaseC = SparseMatTMPL<dcomplex>;
疎行列の要素アクセスについて:
Eigen疎行列は、 SparseMatTMPLのメンバ「Eigen::SparseMatrix<DType, Eigen::RowMajor> matrix」になります。 見ての通り、RowMajorで作成しています。 疎行列の各要素にアクセスしたい場合はEigen疎行列のポインタ情報にアクセスする必要があります。 アクセス用のメソッドをSparseMatTMPLで定義しているので利用してください。
//疎行列の実体を以下とします(実際はSparseMatTMPLのメンバなので個別に作る必要はありません)
SparseMat matA;
//この行列の疎行列実体にアクセス(ポインタです)し、SparseMatTMPLのメソッドを呼び出します
slv_int size = matA.size;
slv_int* start_posL1 = new slv_int[size];
slv_int* end_posL1 = new slv_int[size];
//疎行列のRow方向ポインタを取得します
auto col_ptrL1 = matA.matrix->getColPtr();
//疎行列の値ポインタを取得します
auto val_ptrL1 = matA.matrix->getValuePtr();
//Row方向ポインタの各行の範囲を取得します
matA.matrix->getCols(start_posL1, end_posL1);
//取得した範囲を、各行ごとにループすれば参照できます
for(slv_int ii = 0 ; ii < size ; ii++){
const slv_int c_size = end_posA[ii];
//行iiにおける列方向の値があるところは以下のように
for(slv_int j = start_posA[ii] ; j < c_size ; j++){
slv_int retu = col_ptrA[j];
double temp = val_ptrA[j];
cout << ii <<", " << retu << " = " << temp << end;
}
}