求解4x4矩阵的逆矩阵 - 需要数值上最稳定的解法

13

我想要求解一个4x4矩阵的逆。我的数字以定点格式存储(精度为1.15.16)。

使用浮点数运算,我通常只需构建伴随矩阵并除以行列式(即用暴力方法求解)。这在以前对我很有用,但是当处理定点数时,由于所有乘法操作导致了无法接受的精度损失。

注意:在定点运算中,我总是放弃某些最低有效位。

因此,什么是最稳定的求解矩阵逆的方法?我不太关心性能,但仅仅转换为浮点数会在我的目标体系结构上变得太慢。


普通的高斯消元法效果很好。这取决于你使用的库/类/结构。你可以看一下GSL - axblount
你的矩阵元素的数量级是否接近? - David Nehme
为了最小化截断误差和其他不良影响,请使用“枢轴” - 请参阅《数值分析》中矩阵求逆章节。这是我迄今为止找到的最好的解释。 - DarenW
很抱歉,它们都散落在各个地方。 - Nils Pipenbrinck
您是否有该矩阵的近似条件数?我在答案中引用的论文可以成功处理几百的条件数,但这是针对8x8或32x32矩阵的,因此您可能会做得更好。 - Chris Johnson
6个回答

19

元答:它真的是一个通用4x4矩阵吗? 如果您的矩阵有特殊形式,则有直接的反演公式,可以快速并且保持操作计数较低。

例如,如果它是从图形学中的标准齐次坐标变换:

[ux vx wx tx]
[uy vy wy ty]
[uz vz wz tz]
[ 0  0  0  1]

假设有旋转矩阵、缩放矩阵、平移矩阵的组合,
那么有一个容易推导出的直接公式,即
[ux uy uz -dot(u,t)]
[vx vy vz -dot(v,t)]
[wx wy wz -dot(w,t)]
[ 0  0  0     1    ]

(从链接页面中盗取的ASCII矩阵。)

对于定点数精度损失,你可能无法超越那个。

如果您的矩阵来自您知道其具有更多结构的某个领域,则很可能会有一个简单的答案。


5
如果涉及比例因素,我认为这种方法可能无法奏效? - Alnitak

6
我认为答案取决于矩阵的确切形式。标准分解方法(LU、QR、Cholesky等)与枢轴旋转(必要条件)在固定点上表现相当好,特别是对于小的4x4矩阵。请参考Press等人的书《Numerical Recipes》中对这些方法的描述。 这篇论文提供了一些有用的算法,但不幸的是它被设置了付费墙。他们建议使用(枢轴)Cholesky分解,并增加了一些过于复杂而无法在此列出的额外功能。

5
我想回答Jason S提出的问题:您确定需要反转矩阵吗?这几乎从不必要。不仅如此,它经常是个坏主意。如果您需要解决Ax = b,直接解决系统比将b乘以A逆更稳定。即使您必须为许多b值重复解决Ax = b,反转A仍不是一个好主意。您可以对A进行因式分解(例如LU分解或Cholesky分解)并保存因子,这样每次都不必重新执行该工作,但仍需使用因式分解解决系统。

1
让我问一个不同的问题:您是否绝对需要反转矩阵(称为M),还是需要使用矩阵逆来解决其他方程?(例如,对于已知的M、b,Mx = b)通常有其他方法可以在不明确需要计算逆的情况下完成此操作。或者,如果矩阵M是时间的函数,并且它变化缓慢,那么您可以一次计算完整的逆,然后有迭代的方法来更新它。

1

在执行正常算法之前,您可以考虑将数字加倍到1.31。这将使乘法的数量增加一倍,但是您正在进行矩阵反演,而您所做的任何事情都将与处理器中的乘数密切相关。

对于任何想要找到4x4反演方程的人,您可以使用符号数学软件来解决它们。TI-89甚至可以做到这一点,尽管需要几分钟的时间。

如果您告诉我们矩阵反演为您做了什么,并且它如何与您的其他处理过程相匹配,我们可能会建议替代方案。

-亚当


使用符号数学程序来求逆一个通用矩阵,它会提供公式,让你可以更轻松地进行计算。 - Karl

-3
如果矩阵表示仿射变换(4x4矩阵多次情况下是如此,只要您不引入缩放组件),则其逆矩阵就是上部分3x3旋转部分的转置,最后一列取相反数。显然,如果您需要通用解决方案,则研究高斯消元可能是最简单的方法。

这个答案是不正确的。请查看Adrian的答案,它是正确的,并且方向相同。 - Suma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接