2016-10-05 20 views
0

私は、Matlabのmex関数による固有解を使って線形代数方程式Ax = bを解くことに取り組んでいます。 Matlabワークスペースからの複雑な疎な行列Aと疎ベクトルbが与えられているので、行列AとベクトルbをEigen sparse行列形式でマップしたいと思います。その後、私はそれを解決するためにEigenの線形方程式ソルバーを使用する必要があります。最後に、結果xをMatlabワークスペースに転送する必要があります。MATLABワークスペースからEigenの複雑な疎行列をマッピングする

しかし、私はC++でよくなく、Eigenにも慣れていないからです。私は最初のステップで固執しています。つまり、Eigen acceptedフォーマットで複雑な疎行列を構築します。

私は

Eigen::MappedSparseMatrix<double,RowMajor> mat(rows, cols, nnz, row_ptr, col_index, values); 

、固有の以下の機能があります発見したと私は、上記の「行、colsのための情報を取得するためにこれらのMEX機能などmxGetPr、mxGetPi、mxGetIr、mxGetJcを、使用することができます、nnz、row_ptr、col_index、values "を参照してください。しかし、私の場合、行列Aは複雑な疎行列であるため、 "MappedSparseMatrix"がそれを行うことができるかどうかはわかりません。

できる場合は、「MappedSparseMatrix」の形式はどのようにする必要がありますか?次は正しいですか?

Eigen::MappedSparseMatrix<std::complex<double>> mat(rows, cols, nnz, row_ptr, col_index, values_complex); 

もしそうなら、values_complexをどのように構築すればよいですか? 私は前にrelevant topicを見つけました。私は複雑な密行列を得るために次のコードを使うことができます。

MatrixXcd mat(m,n); 
mat.real() = Map<MatrixXd>(realData,m,n); 
mat.imag() = Map<MatrixXd>(imagData,m,n); 

私の行列Aがスパース行列であるので、しかし、私が次のような複雑な疎行列としてマットを定義した場合、それはエラーが生成されますようだ:

SparseMatrix<std::complex<double> > mat; 
mat.real() = Map<SparseMatrix>(rows, cols, nnz, row_ptr, col_index, realData); 
mat.imag() = Map<SparseMatrix>(rows, cols, nnz, row_ptr, col_index, imagData); 

だから、誰もがいくつかを提供することができますそれのアドバイス?

答えて

0

MatlLab格納二つの別々のバッファ内の複合エントリ:実数成分用と虚数成分のための1つの、固有のインタリーブするそれらを必要とするのに対し:

value_ptr = [r0,i0,r1,i1,r2,i2,...] 

std::complex<>と互換性があるようにします。したがって、あなたの場合は、一時的なバッファを作成して、そのインターリーブ形式の値をMappedSparseMatrixに渡すか、Eigen 3.3を使用する場合はMap<SparseMatrix<double,RowMajor> >に渡す必要があります。

また、インデックスのバッファを調整してゼロベースにする必要があります。この目的のために、col_ptrとrow_ptrのすべてのエントリを1つ減らしてからEigenに渡し、その後に1ずつインクリメントします。

関連する問題