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

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

注意:在定点运算中,我总是丢掉一些最不重要的立即结果。

那么 - 反转矩阵的数值最稳定的方法是什么?我不太关心性能,但简单地说浮点就是放慢我的目标架构。

有帮助吗?

解决方案

我认为答案取决于矩阵的确切形式。具有旋转(基本)的标准分解方法(LU,QR,Cholesky等)在固定点上相当好,特别是对于小的4x4矩阵。请参阅Press等人的“Numerical Recipes”一书。有关这些方法的描述。

本文给出了一些有用的算法,但不幸的是它背后是付费墙。他们建议使用(旋转)Cholesky分解,其中一些额外的功能太复杂,无法在此处列出。

其他提示

元回答:它真的是一般的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矩阵。)

你可能无法击败定点精度损失。

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

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

即使你必须为b的许多值反复解决Ax = b,反转A仍然不是一个好主意。你可以因子 A(比如LU分解或Cholesky分解)并保存因子,这样你每次都不会重做那项工作,但每次使用因子分解时你仍然会解决系统问题。

让我问一个不同的问题:你肯定需要反转矩阵(称之为M),还是需要使用矩阵求逆来求解其他方程? (例如,Mx = b表示已知的M,b)通常还有其他方法可以做到这一点,而不需要明确地计算逆。或者如果矩阵M是时间和函数的函数。它变化缓慢然后你可以计算一次完全逆,&有迭代的方法来更新它。

为了尽量减少截断错误和其他不良问题,请使用“旋转”功能。 - 参见Numerical Recipes中反转矩阵的章节。到目前为止,他们已经找到了最好的解释。

在进行常规算法之前,您可能会考虑加倍到1.31。它会使乘法的数量增加一倍,但是您正在进行矩阵反转,而您所做的任何事情都会与处理器中的乘数相关联。

对于有兴趣找到4x4反转方程的人,您可以使用符号数学包为您解决它们。 TI-89会做到这一点,虽然它需要几分钟。

如果您让我们了解矩阵反转为您做了什么,以及它如何适应您的其余处理,我们可能会建议替代方案。

- 亚当

普通的高斯消除可以很好地发挥作用。

这取决于您正在使用的库/类/结构。您可以查看 GSL

如果矩阵表示仿射变换(只要你没有引入缩放分量,很多时候这就是4x4矩阵的情况),反转就是上3x3旋转部分的转置,最后一列被否定。显然,如果你需要一个通用的解决方案,那么研究高斯消元可能是最简单的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top