2017-12-07 29 views
2

이것은 일종의 모호한 질문이며 나는 아무에게도 대답을 기대하지 않지만 Eigen :: SparseMatrix를 가져 와서 반환하는이 메서드가 있습니다. 나는 그것을 deal.ii 라이브러리에 넣고 싶습니다. deal/iigen에서 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이 거래에서 그런 종류의 지원을 정말로 가지고 있다고 생각하지 않는다 .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; 

`

이 좋아, 그래서 변환하는 방법을 알아 냈어 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

이 질문은 오래되었지만 여전히 도움이 될 수 있습니다. 나는 거래 중 하나이다. 개발자들과 나는 메일 링리스트에서 이것을 보지 못했다. (이것은 SO보다 이러한 유형의 질문에 훨씬 더 적극적이다.)

SparseMatrix은 deal.II에 자체 희소성 패턴을 저장하지 않고 대신 SparsityPattern 개체에 대한 포인터를 저장합니다. 고유 행렬을 두 번 반복해야합니다 : 한 번은 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과 같은 형식을 사용하므로 실제로 복사해야합니다 반복자 인터페이스로.