2017-09-03 59 views
0

私はEigen C++に疎な行列Aを持っています。今、私は別のスパース行列Asymにそれを対称にしたい:Eigen C++で疎行列を対称化する方法は?

私はそれはのような単純なものであろうと期待していた:

Eigen::SparseMatrix<FLOATDATA> A; 
... 
Eigen::SparseMatrix<FLOATDATA> Asym = 0.5*(A+A.transpose()); // error here 

しかしによる明白な理由のために、それは以下のアサート失敗のエラーを与える:

error: static assertion failed: THE_STORAGE_ORDER_OF_BOTH_SIDES_MUST_MATCH 

私の質問にはきちんと固有C++で上記の操作を行う方法ですか?

+0

は対称ですか?そうでない場合、Aとその転置を追加することはできません。つまり、m == nの場合にのみ、2つの行列mxnとnxmを追加することができます。私はA + A^Tが実行される単一の数式を見たこともありません。 A^T x Aを試していますか?時には多くの意味があります。 –

答えて

1

あなたのコードのコンパイルを作成する最も簡単な方法は、正しい格納順序の一時的に転置行列を評価することである。

Eigen::SparseMatrix<FLOATDATA> Asym = 0.5*(A+Eigen::SparseMatrix<FLOATDATA>(A.transpose()))); 
+0

ありがとう!このようにすると一時的な移調が最適化されると思いますか? – user62039

+0

それは一時的を取り除くしない - と私は別の格納順序(多分あなたは行列のいくつかの特別な構造を利用することができない限り)とスパース行列を追加するための効率的なアルゴリズムがあるとは思いません。 – chtz

関連する問題