在谷歌关于矩阵求逆算法的过程中,我发现有几种方法(和意见!)关于如何在代码中执行此操作。 我想知道哪种方法最快,或者性能最好的方法,并试图找到答案我什么都没发现。
我知道在某些情况下可以计算伪逆(使用SVD,cholevsky,...),我实际上在我的代码中使用了一些,而且我知道有几次逆不存在很容易找到特定问题的具体答案,但不是对这个巨大的(巨大的!)问题的一般直觉,即矩阵求逆。
所以我的问题是:
对于小型矩阵,哪种方法的性能最佳?精确度? 大矩阵怎么样?
我的个人情况是6x6(EDIT:symetric)矩阵必须被反转数千次(是的,是的,具有不同的值)并且我需要高精度,但是确保速度非常方便。
请注意,我不正在寻找代码,我会自己编写适合我案例的最适合的答案,但我认为这是许多程序员想要了解的问题。
答案 0 :(得分:5)
没有简单的答案。确保您已阅读并理解this文章。
对于2x2矩阵,可以使用涉及行列式的simple formular来计算逆。但是对于任何更大的东西,我都更喜欢分解,例如一个旋转的LU分解。如果您关注性能并处理大型稀疏矩阵,则迭代求解器可能是合适的。或者,您可以尝试MUMPS(多边形质量平行求解器)并测量性能。迭代求解器的问题在于它们的收敛速度很大程度上取决于逆问题的条件以及是否找到了良好的预处理器。
也许您应该从Eigen库开始,首先尝试使用轮回LU分解。
答案 1 :(得分:0)
我知道,这不是一个答案,但几十年前我不得不为包含浮点数的矩阵编写一个矩阵逆变器函数。我父亲给我看了一本经济学书,里面有对“单纯形”方法的描述(如果我没记错的话)。在这种情况下,可以就地进行反演。对于 n x n 矩阵,相同的方法必须重复 n 次。必须为属于列和行的项目选择一个非空项目,这些项目直到此时才被选择。这是发电机项目。然后它必须被操纵。然后它的行中的所有项目,然后它的列中的所有项目都必须被操纵。最后是所有剩余的项目。
我认为这是一种改变基数的方法。不幸的是我找不到这篇文章的来源......如果有人找到了,请给我一个链接!
希望能帮到你。