Eigen,得到逆失败,而inverse()是如此之慢

时间:2016-08-28 10:17:41

标签: eigen

我想得到逆矩阵,所以这里是代码:

xy

if (m.rows() == m.fullPivLu().rank()) { res = m.inverse(); } m的维度都是5000倍5000.当我在高性能计算机器(Linux,Tianhe 2 SuperComputer)上运行代码时,进程被杀死在res,并且没有生成核心文件或转储信息。控制台返回res = m.inverse();并退出进程。

但我的Ubuntu笔记本电脑没有任何问题。

killed的表现很差,花了很多时间。

那么,为什么inverse()在高性能机器上被杀?谢谢!

1 个答案:

答案 0 :(得分:5)

已知完全旋转LU非常慢,无论其实现如何。

更好地使用PartialPivLU,这得益于高性能矩阵矩阵运算。然后为了充分利用Eigen,使用3.3-beta2版本并使用FMA(-mfma)和OpenMP(例如,-fopenmp)支持编译,并且不要忘记启用编译器优化-O3。此操作不应超过几秒钟。

最后,你真的需要明确计算逆?如果您只将它应用于某些向量或矩阵(即A ^ -1 * B或B * A ^ -1),那么最好以分解形式应用逆而不是显式计算它。使用Eigen 3.3:

MatrixXd A = ...;
PartialPivLU<MatrixXd> lu(A);
x = lu.inverse() * b; // solve Ax=b, same as x = lu.solve(b);
x = b * lu.inverse(); // solve xA=b

在这些表达式中,逆是显式计算!