2017-01-20 8 views
2

私はEigenに2つの疎行列を持ち、それらを垂直に1つに結合したいと考えています。例として、コードのターゲットは次のようになります。スパース行列Eigenを連結する

SparseMatrix<double> matrix1; 
matrix1.resize(10, 10); 
SparseMatrix<double> matrix2; 
matrix2.resize(5, 10); 

SparseMatrix<double> MATRIX_JOIN; 
MATRIX_JOIN.resize(15, 10); 
MATRIX_JOIN << matrix1, matrix2; 

私はそれを実装することができませんでした、しかしforumにいくつかの解決策を見つけました。

マトリクスを垂直に結合する適切な方法は何ですか?

編集

私の実装:

SparseMatrix<double> L; 
SparseMatrix<double> C; 
// ... (Operations with the matrices) 
SparseMatrix<double> EMATRIX; 
EMATRIX.resize(L.rows() + C.rows(), L.cols()); 
EMATRIX.middleRows(0, L.rows()) = L; 
EMATRIX.middleRows(L.rows(), C.rows()) = C; 

私は、コンパイラに右側をacording、種類のエラーを取得する固有である::ブロックと左側が固有である::疎行列

+0

「実装できませんでした」とは何ですか?平均? –

+0

@ Code-Apprenticeフォーラムで見つけたソリューションを実装できませんでした。それはまた、(フォーラムのソリューションの)疎と密なマトリックスに参加することを意味しました – Javier

+0

同じ単語を繰り返しても、単語の意味は説明されません。あなたが書いたコードをコンパイルして実行すると、あなたがしたことと何が起こるのかを正確に示してください。 –

答えて

3

私が知る限り、現在は組み込みのソリューションはありません。 the internal insertBack functionを使用すると、効率的にソリューションより効率的になります。

SparseMatrix<double> M(L.rows() + C.rows(), L.cols()); 
M.reserve(L.nonZeros() + C.nonZeros()); 
for(Index c=0; c<L.cols(); ++c) 
{ 
    for(SparseMatrix<double>::InnerIterator itL(L, c); itL; ++itL) 
     M.insertBack(itL.row(), c) = itL.value(); 
    for(SparseMatrix<double>::InnerIterator itC(C, c); itC; ++itC) 
     M.insertBack(itC.row(), c) = itC.value(); 
} 
M.finalize(); 
+0

これはトリプレットを使用するより効率的ですか? – Javier

+0

@Javierそれはすべての非常に奇妙な場合にする必要があります。多くの場合、それほど重要ではないかもしれません。 – chtz

1

私は次のことをやってしまった:

MATRIX_JOIN.resize(matrix1.rows() + matrix2.rows(), matrix1.cols() + matrix2.cols()); 
MATRIX_JOIN.setZero(); 

// Fill MATRIX_JOIN with triples from the other matrices 
std::vector<Triplet<double> > tripletList; 
for (int k = 0; k < matrix1.outerSize(); ++k) 
{ 
    for (SparseMatrix<double>::InnerIterator it(matrix1, k); it; ++it) 
    { 
     tripletList.push_back(Triplet<double>(it.row(), it.col(), it.value())); 
    } 
} 
for (int k = 0; k < matrix2.outerSize(); ++k) 
{ 
    for (SparseMatrix<double>::InnerIterator it(matrix2, k); it; ++it) 
    { 
     tripletList.push_back(Triplet<double>(it.row(), it.col(), it.value())); 
    } 
} 
FINALMATRIX.setFromTriplets(tripletList.begin(), tripletList.end()); 

tripleList.reserve(X)を呼び出すことによってスピードアップを行うことができます.Xは挿入する予定のトリプレットの量です。

関連する問題