13

我想反转一个 4x4 矩阵。我的数字以定点格式存储(准确地说是 1.15.16)。

使用浮点算术,我通常只构建伴随矩阵并除以行列式(例如蛮力解决方案)。到目前为止,这对我有用,但是在处理定点数时,由于使用了所有乘法,我得到了不可接受的精度损失。

注意:在定点算术中,我总是丢弃一些立即结果的最低有效位。

那么-反转矩阵的最稳定的数值方法是什么?我不太在意性能,但简单地使用浮点会减慢我的目标架构。

4

6 回答 6

18

元答案:它真的是一个通用的 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 矩阵。)

由于定点精度的损失,您可能无法击败它。

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

于 2008-10-01T00:24:52.063 回答
6

我认为这个问题的答案取决于矩阵的确切形式。具有旋转(基本)的标准分解方法(LU、QR、Cholesky 等)在固定点上相当不错,尤其是对于小型 4x4 矩阵。请参阅 Press 等人的《数字食谱》一书。有关这些方法的说明。

这篇论文提供了一些有用的算法,但不幸的是,它在付费墙后面。他们建议使用(枢轴)Cholesky 分解,其中包含一些过于复杂而无法在此处列出的附加功能。

于 2008-10-01T00:23:51.037 回答
5

我想支持 Jason S 提出的问题:您确定需要反转矩阵吗?这几乎没有必要。不仅如此,这通常是一个坏主意。如果您需要求解 Ax = b,则直接求解系统比将 b 乘以 A 逆在数值上更稳定。

即使您必须一遍又一遍地解决 Ax = b 的许多 b 值,反转 A 仍然不是一个好主意。您可以分解 A(例如 LU 分解或 Cholesky 分解)并保存这些因子,这样您就不会重做每次都有效,但是您仍然每次使用分解都可以解决系统问题。

于 2008-12-10T15:02:19.570 回答
1

在执行正常算法之前,您可能会考虑加倍到 1.31。它会使乘法次数增加一倍,但是您正在执行矩阵求逆,并且您所做的任何事情都将与处理器中的乘法器密切相关。

对于任何有兴趣找到 4x4 反转方程的人,您可以使用符号数学包为您解决它们。TI-89 甚至可以做到,尽管需要几分钟。

如果您告诉我们矩阵反转对您有什么作用,以及它如何适合您的其余处理,我们可能会提出替代方案。

-亚当

于 2008-10-01T00:36:38.680 回答
1

让我问一个不同的问题:您肯定需要对矩阵求逆(称为 M),还是需要使用矩阵求逆来求解其他方程?(例如,对于已知的 M,b,Mx = b)通常有其他方法可以做到这一点,而无需明确需要计算逆。或者,如果矩阵 M 是时间的函数并且它变化缓慢,那么您可以计算一次完整的逆矩阵,并且有迭代方法来更新它。

于 2008-12-10T14:48:42.810 回答
-3

如果矩阵表示仿射变换(很多时候这是 4x4 矩阵的情况,只要您不引入缩放分量),则逆只是上部 3x3 旋转部分的转置,最后一列取反。显然,如果您需要一个广义的解决方案,那么研究高斯消除可能是最简单的。

于 2008-10-01T00:29:31.833 回答