2017-06-21 15 views
0

私はSparse RowMajor行列を埋めることを試みています。ガイドに従って、私はトリプレット法を使用していました:しかし、この方法では空の行列が生成されます。私は、トリプレットリストメソッドでRowMajor行列を満たす例を見つけることができませんでしたが、それは可能ですか?Eigen fill up Sparse Rowトリプレット付きの主要行列

#include <iostream> 
#include <Eigen/SparseCore> 
#include <vector> 
using namespace Eigen; 
using namespace std; 

int main() 
{ 
    int m = 3, n = 7; 
    SparseMatrix<double, RowMajor> M(m,n); 
    typedef Triplet<double,int> T; 
    vector<T> entries; 
    for(int k=1; k<=9;++k) 
    entries.push_back(T(internal::random<int>(0,m-1), internal::random<int>(0,n-1), k)); 
    M.setFromTriplets(entries.begin(), entries.end()); 
    cout << MatrixXd(M) << "\n"; 
} 

生成します:

答えて

1

作品私のために、ここで自己完結例です

1 0 0 8 4 0 0 
0 3 0 6 0 0 0 
16 0 0 2 0 0 5 

EDIT:

だから、問題はあなたのコードの構造であり、私はget_dataが三つ組リストと疎行列を値で取得しているのに対し、それらはこの関数で変更されていることがわかりますstは参照によってそれらを渡したいと思う可能性が高い。

+0

残念ながら、別の機能になっていたので、表示されているコードに行列の初期化を追加するのを忘れてしまいました。私は 'Eigen :: SparseMatrix data_matrix(rows、cols);で初期化すると信じています; – ClonedOne

+0

実際、 'ColMajor'マトリックスを使用すると、あなたのために動作することを確認できますか? – ggael

+0

その間、別のフォーラム(面白い:)であなたの答えの1つの代替ソリューションを見つけました。現時点では、 'Eigen :: SparseMatrix data_matrix(cur_rows、cols);を実行しています。 data_matrix.reserve(cur_rows * 100000); 'data_matrix.insert(row_iter、words [word_freq [0]])= std :: stoi(word_freq [1]); 'で埋めて、うまくいくようです。 2つの選択肢の間に顕著なパフォーマンスの違いがあるかどうか知っていますか? – ClonedOne

関連する問題