2017-04-21 4 views
-1

固有中でスパース行列を初期化するために、どのように、我々はこのようないくつかの他の行列またはベクトルと行列またはベクトルを初期化することができます:固有:いくつかのサブ疎行列

を:私が達成したいものを

MatrixXf matA(2, 2); 
matA << 1, 2, 3, 4; 
MatrixXf matB(4, 4); 
matB << matA, matA/10, matA/10, matA; 
std::cout << matB << std::endl; 

SparseMatrix<double> matA(2, 2); 
matA.coeffRef(0, 0) = 1; 
matA.coeffRef(1, 1) = 1; 
SparseMatrix<double> matB(4, 4); 
matB << matA, matA/10, matA/10, matA; 
std::cout << matB << std::endl; 

その後、私はこのような行列を得る:、それは疎行列のために動作しません、

1 0 0.1 0 
0 1 0 0.1 
0.1 0 1 0 
0 0.1 0 0.1 

をが、このように固有値は組み込みの初期化子を持っていますか?もしそうなら、私はそれを自分で書く必要がありますか?どうやって?

+0

記録のために、私は機能要求を記入しました:http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1420。これは間違いなく便利な機能です。 – ggael

答えて

1

保存形式のため、このような初期化子を使用することはできません。ただし、パフォーマンス上の理由から、サブスパース行列への書き込みがはるかに限られており、列の現在唯一の連続したセット

列優先(それぞれの:マニュアルSparse matrix manipulations > Block operationsから(それぞれの行。)。行メジャー)SparseMatrixは書き込み可能です。さらに、この情報はコンパイル時に知る必要があり、ブロック(...)やコーナー*(...)などのメソッドは除外されます。

唯一のオプションは、すべてを密行列に変換し、カンマイニシャライザを使用してスパースに戻すことです。

#include <iostream> 
#include <Eigen/Sparse> 

using namespace Eigen; 
typedef SparseMatrix<double> SparseMatrixXd; 

int main() 
{ 
    SparseMatrixXd matA(2, 2); 
    matA.coeffRef(0, 0) = 1; 
    matA.coeffRef(1, 1) = 1; 
    SparseMatrixXd matB(4, 4); 
    MatrixXd matC(4,4); 
    matC << 
    MatrixXd(matA), 
    MatrixXd(matA)/10, 
    MatrixXd(matA)/10, 
    MatrixXd(matA); 
    matB = matC.sparseView(); 
    std::cout << matB << std::endl; 
} 

また、この正確な例では、サポートされていないクロネッカー製品モジュールを使用できます。

#include <iostream> 
#include <Eigen/Sparse> 
#include <unsupported/Eigen/KroneckerProduct> 

using namespace Eigen; 
typedef SparseMatrix<double> SparseMatrixXd; 

int main() 
{ 
    SparseMatrixXd matA(2, 2); 
    matA.coeffRef(0, 0) = 1; 
    matA.coeffRef(1, 1) = 1; 
    SparseMatrixXd matB(4, 4); 
    matB = 
    kroneckerProduct((MatrixXd(2,2) << 1,0,0,1).finished(), matA) + 
    kroneckerProduct((MatrixXd(2,2) << 0,1,1,0).finished(), matA/10); 
    std::cout << matB << std::endl; 
}