c++ - 在 Eigen 中应用逆变换

标签 c++ migration permutation eigen

我正在尝试从 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. 与什么相比,循环解决方案是否有任何性能损失(对于就地情况) Eigen呢?

最佳答案

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

关于c++ - 在 Eigen 中应用逆变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49637702/

相关文章:

c++ - 测量程序启动时动态链接所花费的时间?

javascript - 从 JS 迁移到 TS,Jest 看不到 "globals"

c++ - 将 C++ 从 VS2003 迁移到 VS2005 需要更改哪些代码?

algorithm - 在 N 维矩阵中找到大于 x 的值,其中 x 是索引之和

arrays - 如何使用指定数量的元素创建指定大小的数组的每个版本?

c++ - 在 CryptoAPI 中识别 CSP 提供者

c++ - 双包含解决方案?

asp.net-mvc - Entity Framework TPC 继承(现在请拍我)

具有重复的排列

c++ - 多态方法的可选参数,通过引用?