在c++中更高效、更快速地反转矩阵(大矩阵和小矩阵)

More efficient and fast way of inverting matrices in c++ (big and small)

本文关键字:高效 c++      更新时间:2023-10-16

编辑。既然有人问我这个问题,我就获得了求解断层扫描线性方程组的博士学位。由于这个问题仍然有很多流量,我想强调@selliptize回答的第一句话:没有简单的答案。它在很大程度上取决于矩阵的性质,而且几乎总是不想反转矩阵。

现在,对于这个非常无辜的人提出的最初的问题,他认为这很容易得到回答。。。


在谷歌搜索矩阵求逆算法时,我发现关于如何在代码中做到这一点,有几种方法(和意见!(。我想知道哪种方法是最快的,还是性能最好的,但试图找到答案却一无所获。

我知道在某些情况下,可以计算伪逆(使用SVD、cholevsky…(,我实际上在代码中使用了其中的一些,我知道有好几次逆根本不存在,等等。很容易找到特定问题的具体答案,但对于矩阵求逆这一大问题(巨大!(,却不是一般的直觉。

所以我的问题是:

对于小矩阵,什么方法的性能最好?精度如何?大矩阵呢

我个人的例子是一个6x6(编辑:symmetric(矩阵,它必须反转数千次(是的,是的,有不同的值(,我需要高精度,但速度肯定会非常方便。

请注意,我不是在寻找代码,我会自己编写最适合我的答案,但我认为这是很多程序员都想知道的问题。

没有简单的答案。确保你已经阅读并理解了这篇文章。

对于2x2矩阵,可以用一个涉及行列式的简单公式来计算逆。但对于任何更大的因子分解,我更喜欢因子分解,例如一个枢轴LU因子分解。如果您关心性能并处理大型稀疏矩阵,迭代求解器可能是合适的。或者,您可以尝试MUMPS(多平面体量并行解算器(并测量性能。迭代求解器的问题是,它们的收敛速度在很大程度上取决于反问题的条件以及你是否找到了好的预处理器。

也许您应该从Eigen库开始,并首先尝试透视LU因子分解。