c++ - 在 C++ 中更有效和快速的反转矩阵的方法(大和小)

标签 c++ performance matrix precision matrix-inverse

编辑。由于提出了这个问题,我获得了解决断层扫描线性方程组的博士学位。由于这个问题仍然有很多流量,我想强调@sellibitze 回答的第一句话:There is not simple answer。这在很大程度上取决于矩阵的性质,而且几乎总是您不想反转矩阵。

现在,对于这个认为这很容易回答的非常无辜的人提出的原始问题...


在谷歌搜索矩阵求逆算法时,我发现有几种方法(和意见!)关于如何在代码中执行此操作。 我想知道哪种方法最快,或者性能最好的方法,并试图找到答案,但我一无所获。

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

所以我的问题是:

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

我个人的情况是一个 6x6(编辑:对称)矩阵,必须反转数千次(是的,是的,具有不同的值)并且我需要高精度,但可以肯定的是速度会非常方便。

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

最佳答案

没有简单的答案。确保您已阅读并理解 this文章。

对于 2x2 矩阵计算逆可以用 simple formular 完成涉及行列式。但对于任何更大的东西,我更喜欢分解,例如旋转 LU 分解。如果您关心性能并处理大型稀疏矩阵,迭代求解器可能是合适的。或者,您可以尝试 MUMPS(multifrontal massivly parallel solver)并测量性能。迭代求解器的问题在于它们的收敛速度在很大程度上取决于反问题的条件以及您是否找到了好的预处理器。

也许你应该从 Eigen 开始库并首先尝试旋转 LU 分解。

关于c++ - 在 C++ 中更有效和快速的反转矩阵的方法(大和小),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14360935/

相关文章:

c# - 在windows 8.1(通用应用程序)中解码mp3

c++ - 使用 CUDA 进行矩阵操作

c# - Parallel.For 令人失望的性能

matrix - Julia - 如何洗牌矩阵

python - 计算巨大稀疏矩阵的点积时出现 MemoryError

c++ - 涉及枚举类和宏扩展的代码片段的含义

c++ - 这个 Objective-C Cocos2D 和 CCNode 的 C++ 等价物是什么

C++ - 错误 : multiple types in one declaration

java - Java中的“大字典”实现

performance - 为什么 std::pair 比 std::tuple 更快