为什么Eigen(版本3.2.5)不能得到正确的转置矩阵

Why Eigen (version 3.2.5) cannot get correct transposed matrix

本文关键字:转置 不能 版本 Eigen 为什么      更新时间:2023-10-16

我正在使用特征库来做基本的矩阵操作。然而,我甚至不能从一个3*3矩阵中得到一个正确的转置矩阵。下面是一个简单的代码示例:

#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

结果很奇怪。我想知道我的代码有什么问题?我想艾根不可能有这么明显的缺陷。

这是由混叠效果引起的,类似于您这样做会发生的情况:

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

您有几种方法可以规避此问题。不太可取的方法是使用临时的:

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

或者,更好的是,告诉Eigen它是相同的矩阵并使用

m.transposeInPlace();