2017-06-12 16 views
3

Eigen3ライブラリ(バージョン3.3.2)を使ってEigen :: MatrixXdオブジェクトの対角線に要素を追加したいと思います。Eigen3のMatrixとDiagonalMatrixを追加する

両方の最適化とconst性を使用することができることのために、私はこの

const MatrixXd a(2,2); a << 1, 2, 3, 4; 
const VectorXd v(2); v << 10, 20; 
const MatrixXd b = a + v.asDiagonal(); 

のように、元の対角行列を追加することによって、これをしたいしかし、これは動作しません:私は約コンパイラエラーを取得しますoperator+がありません。 2つを追加するとMatrixXdが機能するため、斜めの特殊化のために動作することが期待されます。

constを削除することは役に立ちません。静的なサイズの行列を使用すると違いはありませんので、動的なサイズのものではありません。 asDiagonal()によって返されたDiagonalWrapperを使用するのではなく、DiagonalMatrixを明示的に構築することも同じエラーが発生します。

倍数は、です。MatrixXd c = a * v.asDiagonal();は正しくコンパイルされて実行されます。何か間違っているのですか、またはoperator+(Matrix,DiagonalMatrix)がライブラリから欠落していますか?同等の質問尋ねたとKDE /固有のフォーラムに答えれることにリンクするための@CoryKramerへ

+1

https://forum.kde.org/viewtopic.php?f=74&t=136617 – CoryKramer

+0

関連:http://eigen.tuxfamily.org/bz/show_bug.cgi?id=610 – chtz

答えて

1

ありがとう:https://forum.kde.org/viewtopic.php?f=74&t=136617ここに後世のための要約です:

アイゲンMatrixの「ノーマル」追加とDiagonalMatrixまたはDiagonalWrapperのいずれかサポートされている演算ではありませんが、乗算または化合物の追加は問題ありません。 +=は、constオブジェクトを使用しようとすると、asDiagonal()コールから明示的にMatrix2dを構築しようとするとオプションではありません - なぜ私はそれを試してみませんでしたか? - うまく動作します:

MatrixXd b = a + Matrix2d(v.asDiagonal()); 

パフォーマンスの低下の可能性があると思います。そのため、タイプの構成がないとサポートされません。しかし、対角のインデックスを手作業でループするという厄介な代替案よりも悪化する可能性は低いです。

関連する問題