我正在尝试从本征3.2迁移到本征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存储库中的主数据库中,我也看不到任何可能有帮助的更改,但是我可能无法理解模板),它引发了错误:
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中使用逆转置的正确方法是什么?
  • 与循环解决方案相比,循环解决方案是否存在性能损失(就地情况)?
    本征吗?
  • 最佳答案

    这是3.3分支中引入的缺点。现在,它已在3.3和默认分支中修复。

    09-30 14:48
    查看更多