代码之家  ›  专栏  ›  技术社区  ›  Askold Ilvento

在Eigen中应用逆换位

  •  1
  • Askold Ilvento  · 技术社区  · 7 年前

    我正在尝试从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)));
    

    我的问题:

    1. 在Eigen 3.4中使用反向转置的正确方法是什么?

    2. 在循环解决方案中(对于就地情况)是否有任何性能损失 艾根有吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   ggael    7 年前

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