2017-12-07 24 views
2

これはまったくわかりにくい質問ですが、私は実際に誰かが答えられるとは思っていませんが、私はEigen :: SparseMatrixを取って返すこのメソッドを持っています。私はdeal.iiライブラリにそれを入れたいですが、deal.ii/EigenからSparseMatrixをコピー/変換する方法はありますか?Eigen :: SparseMatrix <double>をdeal.ii :: SparseMatrix <double>に変換しますか?

`SparseMatrix<double> matrix(sparsity); 
...//fill matrix 

    Epetra_Map map(TrilinosWrappers::types::int_type(5), 
       TrilinosWrappers::types::int_type(5), 
       0, 
       Utilities::Trilinos::comm_world()); 

    TrilinosWrappers::SparseMatrix tmatrix; 
    tmatrix.reinit (map, map, matrix, 0, false);`  

同様アイゲン::疎行列があります:私はあなたのような何かがTrilinos疎行列にdeal.iiコピーすることができます知っていますか?私はEigenが本当にdeal.iiでその種のサポートを持っていないと思う。だから、おそらくそこにいくつかの「ブルートフォース」タイプの方法は明らかに動作しないコードでこの試みのように、次のとおりです。

`

Eigen::SparseMatrix<double> ConvertToEigenMatrix(SparseMatrix<double> data) 
{ 
    Eigen::SparseMatrix<double> eMatrix(data.m(), data.n()); 
    for (int i = 0; i < data.m(); ++i) 
     eMatrix.row(i) = Eigen::SparseMatrix<double> ::Map(&data[i][0], data.n()); 
    return eMatrix; 

`

[OK]をので、私は変換する方法を考え出しましたdealii :: SparseMatrix - > Eigen :: SparseMatrixから。

SparseMatrix<double>::iterator smi = matrix.begin(); 
    SparseMatrix<double>::iterator smi_end = matrix.end(); 

    unsigned int row,col; 
    double val; 
    for (; smi!=smi_end; ++smi) 
    { 
     row = smi->row(); 
     col = smi->column(); 
     val = smi->value(); 

     spMat.insert(row, col) = val; 
     std::cout << val << std::endl; 
    } 

いいえ、私はちょうどその逆を理解する必要があります。

+1

私は 'deal.ii'についてはわかりませんが、CRSまたはCCS形式の生のバッファを渡す方法があれば、' Eigen :: SparseMatrix'を ' outerIndexPtr() '、' innerIndexPtr() '、および' valuesPtr() 'メソッドを呼び出します。 – ggael

答えて

1

この質問は古いですが、おそらく私はまだ助けることができます。私はdeal.IIの開発者の一人であり、私はメーリングリストでこれを見ることは覚えていません(これは、SOよりもこれらのタイプの質問に対してもっと活発です)。

SparseMatrixでdeal.IIは独自のスパースパターンを保存しません。代わりに、SparsityPatternオブジェクトへのポインタを格納します。固有行列を2回ループする必要があります.1回はSparsityPatternを設定し、もう一度行列値をコピーします。以下のような何かが動作しているようです:

#include <deal.II/lac/dynamic_sparsity_pattern.h> 
#include <deal.II/lac/sparsity_pattern.h> 
#include <deal.II/lac/sparse_matrix.h> 

#include <eigen3/Eigen/Sparse> 

#include <iostream> 

int main() 
{ 
    const std::size_t shape = 3; 
    Eigen::SparseMatrix<double> matrix(shape, shape); 
    matrix.insert(0, 0) = 1.0; 
    matrix.insert(0, 1) = 2.0; 
    matrix.insert(0, 2) = 1.0; 
    matrix.insert(2, 2) = 2.0; 
    matrix.makeCompressed(); 

    { 
    dealii::SparsityPattern sparsity_pattern(matrix.rows(), matrix.cols()); 
    dealii::DynamicSparsityPattern dynamic_sparsity_pattern(matrix.rows(), matrix.cols()); 

    for (decltype(matrix.outerSize()) row_n = 0; row_n < matrix.outerSize(); ++row_n) 
     for (Eigen::SparseMatrix<double>::InnerIterator it(matrix, row_n); it; ++it) 
     dynamic_sparsity_pattern.add(it.row(), it.col()); 

    sparsity_pattern.copy_from(dynamic_sparsity_pattern); 
    dealii::SparseMatrix<double> matrix2(sparsity_pattern); 

    for (decltype(matrix.outerSize()) row_n = 0; row_n < matrix.outerSize(); ++row_n) 
     for (Eigen::SparseMatrix<double>::InnerIterator it(matrix, row_n); it; ++it) 
     matrix2.set(it.row(), it.col(), it.value()); 

    matrix2.print(std::cout); // prints the right matrix 
    } 
} 

あなたはあまりにもSparsityPatternオブジェクトの寿命を管理する必要があります。

deal.IIはCSRまたはCSCを使用していません:主対角線のエントリが最初にその行のマトリックスエントリを含む配列に格納されているので、CSRのような形式を使用します。イテレータインタフェースを使用します。

関連する問題