2016-10-05 16 views
3

私はEigenライブラリを使って基本的な行列操作を行います。しかし、私は3 * 3行列から正しい転置行列を得ることさえできませんでした。以下は、単純なコードサンプルです:なぜEigen(バージョン3.2.5)が正しい転置行列を得ることができないのですか

#include <iostream> 
#include <Eigen/Core> 
#include <Eigen/Dense> 
using namespace std; 
using namespace Eigen; 

int main(int argc, char *argv[]) 
{ 

Matrix3d m; 

m << 1, 2, 3, 4, 5, 6, 7, 8, 9; 
cout << "before transpose: " << endl; 
cout << m; 
cout << endl; 

m = m.transpose(); 

cout << "after transpose: " << endl; 
cout << m; 


return 0; 
} 

印刷結果は次のとおりです。

before transpose: 
1 2 3 
4 5 6 
7 8 9 
after transpose: 
1 2 3 
2 5 6 
3 6 9 

結果はかなり奇妙です。私は自分のコードに何が問題なのか疑問に思っていましたか?私はEigenがそのような明白なバグを持っていなかったと思う。

+1

を使用するように、

m = m.transpose().eval(); 

または、より良い:あまり好ましい方法では、一時的に使用することですいわゆるデバッグモード)、問題の原因を示すアサーションが必要です。 – ggael

答えて

1

これはバグではなく、間違った転置を使用しています。ここを参照してください:

for(int i = 0; i < a.size(); i++) 
    a[i] = a[a.size()-1-i]; 

あなたはこれを回避するには、いくつかの方法があります:あなたがした場合に何が起こるかに似てエイリアシング効果によって引き起こされていますhttps://eigen.tuxfamily.org/dox/classEigen_1_1DenseBase.html#a3c187c30922fc5e42f208ae3eb0970ee

+0

ありがとうございましたAaronl、私は正教会の文書をチェックしてください。本当に私の混乱に答えました。 – Woolongtea

1

。それは同じ行列だという固有を伝えると、あなたは `-DNDEBUG`(またはそうでなくてコンパイルした場合

m.transposeInPlace(); 
関連する問題