【问题标题】:Applying inverse transposition in Eigen在 Eigen 中应用逆转置
【发布时间】:2018-04-03 19:23:51
【问题描述】:

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

我的问题:

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

  2. 与什么相比,循环解决方案中是否有任何性能损失(对于就地情况) 本征呢?

【问题讨论】:

  • 解决方法:Q.transpose() = P*Q.transpose();

标签: c++ migration permutation eigen


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    相关资源
    最近更新 更多