我想得到逆矩阵,所以这里是代码:
xy
if (m.rows() == m.fullPivLu().rank())
{
res = m.inverse();
}
和m
的维度都是5000倍5000.当我在高性能计算机器(Linux,Tianhe 2 SuperComputer)上运行代码时,进程被杀死在res
,并且没有生成核心文件或转储信息。控制台返回res = m.inverse();
并退出进程。
但我的Ubuntu笔记本电脑没有任何问题。
killed
的表现很差,花了很多时间。
那么,为什么inverse()
在高性能机器上被杀?谢谢!
答案 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
在这些表达式中,逆是不显式计算!