2016-10-05 2 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

을 사용 (정도에서하는 호출 된 디버그 모드) 문제의 원인을 알리는 어설 션이 있어야합니다. – 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

감사합니다. 아론, 공식 문서를 확인 했어야했는데. 그게 진짜 내 혼란에 대답했다. – Woolongtea

1

. 덜 바람직한 방법은 사용하는 것입니다 임시 :

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

또는 더 나은,이 같은 매트릭스 있다는 아이겐에게 당신이 -DNDEBUG``없이 컴파일 된 경우

m.transposeInPlace();