我正在尝试从 Eigen 3.2 迁移到 Eigen 3.3。但是找不到应用逆转置的好方法。
有一个类似的issue ,但作者没有提供代码和其他细节。
以下代码适用于 Eigen 3.2.9
#include <Eigen/Dense>
int main(){
using namespace Eigen;
MatrixXd Q(MatrixXd::Random(3,3));
VectorXi x(3);
x << 0, 2, 1;
Transpositions<Dynamic> P(x);
Q = Q * P.inverse(); //or P.transpose()
return 0;
}
但是对于 Eigen 3.3.4(在 Eigen 存储库的 master 中,我也没有看到任何可能有帮助的更改,但我可能无法理解该模板)它会引发错误:
error: ‘const class Eigen::Transpose<Eigen::TranspositionsBase<Eigen::Transpositions<-1> > >’ has no member named ‘derived’
return Product<OtherDerived, Transpose, AliasFreeProduct>(matrix.derived(), trt.derived());
方法 inverse
本身存在,但我不能分配它的结果(在两个 Eigen 中)
P.inverse(); // compiles
P = P.inverse(); // not compiles
解决方法似乎很简单:
for (Transpositions<Dynamic>::StorageIndex i = 0; i < P.size(); ++i) Q.col(i).swap(Q.col(P(i)));
我的问题:
在 Eigen 3.4 中使用逆转置的正确方法是什么?
与什么相比,循环解决方案是否有任何性能损失(对于就地情况) Eigen呢?
最佳答案
这是3.3分支引入的一个缺点。它现在已在 3.3 和默认分支中得到修复。
关于c++ - 在 Eigen 中应用逆变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49637702/