从Eigen 3.2迁移至3.3:逆转置操作适配问题求助
解决Eigen 3.3中Transpositions逆置换操作的迁移问题
我帮你梳理下这个Eigen版本迁移的问题——从3.2升到3.3后,Transpositions的逆置换写法确实有变化,主要是Eigen对这个类的API做了优化调整。
问题原因
在Eigen 3.2中,Transpositions::inverse()直接返回一个新的Transpositions对象,所以你可以直接用它参与矩阵乘法;但到了3.3版本,inverse()返回的是一个轻量级的代理对象(类型是Inverse<Transpositions<Dynamic>>),这个代理对象在某些情况下无法直接和矩阵做operator*运算,导致编译失败。
而且从数学角度来说,置换的逆置换等价于它的转置,所以原来用P.inverse()的地方,完全可以用P.transpose()来替代,这也是更高效的写法。
修正后的代码
这里给你两种可行的修正方式:
方式1:利用置换的转置等价于逆置换(推荐)
这种方式更高效,也符合置换的数学性质:
#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); // 置换的逆=转置,直接用transpose()替代inverse() Q = Q * P.transpose(); return 0; }
方式2:显式求值代理对象
如果你更倾向于保留inverse()的写法,可以调用eval()方法将代理对象转换为实际的Transpositions实例:
#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); // 显式对inverse()的代理对象求值,再参与乘法 Q = Q * P.inverse().eval(); return 0; }
额外提示
如果你需要对矩阵的行进行逆置换操作,记得把置换放在乘法的左侧:
// 对Q的行应用逆置换 Q = P.transpose() * Q;
内容的提问来源于stack exchange,提问作者Askold Ilvento
相关产品推荐
相关产品推荐

