我正在尝试从Eigen3.2迁移到Eigen3.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 repository的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
它本身存在,但我无法指定它的结果(在两个特征中都不存在)
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中使用反向转置的正确方法是什么?
-
在循环解决方案中(对于就地情况)是否有任何性能损失
艾根有吗?