我想要反转一个4x4矩阵。我的数字以定点格式存储(确切地说是1.15.16)。
对于浮点运算,我通常只建立伴随矩阵并除以行列式(例如强力解决方案)。到目前为止,这对我有用,但在处理定点数时,由于使用了所有乘法,我得到了不可接受的精度损失。
注意:在定点运算中,我总是丢掉一些最不重要的立即结果。
那么 - 反转矩阵的数值最稳定的方法是什么?我不太关心性能,但简单地说浮点就是放慢我的目标架构。
答案 0 :(得分:16)
例如,如果它是来自图形的标准同质坐标变换,例如:
[ux vx wx tx]
[uy vy wy ty]
[uz vz wz tz]
[ 0 0 0 1]
(假设旋转,比例,平移矩阵的组合)
然后有easily-derivable direct formula,这是
[ux uy uz -dot(u,t)]
[vx vy vz -dot(v,t)]
[wx wy wz -dot(w,t)]
[ 0 0 0 1 ]
(从链接页面中窃取的ASCII矩阵。)
你可能无法在固定点上失去精确度。
如果您的矩阵来自某个域,您知道它的结构更多,那么可能会有一个简单的答案。
答案 1 :(得分:5)
我认为答案取决于矩阵的确切形式。具有旋转(基本)的标准分解方法(LU,QR,Cholesky等)在固定点上相当好,特别是对于小的4x4矩阵。请参阅Press等人的“Numerical Recipes”一书。有关这些方法的描述。
This paper提供了一些有用的算法,但不幸的是它背后是付费墙。他们建议使用(旋转)Cholesky分解,其中一些额外的功能太复杂,无法在此处列出。
答案 2 :(得分:5)
我想提出Jason S提出的问题:你确定你需要反转你的矩阵吗?这几乎是不必要的。不仅如此,这通常是一个坏主意。如果你需要求解Ax = b,那么直接求解系统在数值上更稳定,而不是将b乘以A逆。
即使你必须为b的许多值反复解决Ax = b,反转A仍然不是一个好主意。你可以因子 A(比如LU分解或Cholesky分解)并保存因子,这样你每次都不会重做那项工作,但每次使用分解时你仍然会解决系统问题。
答案 3 :(得分:2)
让我问一个不同的问题:你肯定需要反转矩阵(称之为M),还是需要使用矩阵求逆来求解其他方程? (例如,Mx = b表示已知的M,b)通常还有其他方法可以做到这一点,而不需要明确地计算逆。或者如果矩阵M是时间和函数的函数。它变化缓慢然后你可以计算一次完全逆,&有迭代的方法来更新它。
答案 4 :(得分:1)
要最大限度地减少截断错误和其他不良,请使用“pivoting” - 请参阅“数字配方”中的反转矩阵一章。到目前为止,他们已经找到了最好的解释。
答案 5 :(得分:1)
在进行常规算法之前,您可能会考虑加倍到1.31。它会使乘法的数量增加一倍,但是您正在进行矩阵反转,而您所做的任何事情都会与处理器中的乘数相关联。
对于有兴趣找到4x4反转方程的人,您可以使用符号数学包为您解决它们。 TI-89会做到这一点,虽然它需要几分钟。
如果您让我们了解矩阵反转为您做了什么,以及它如何适应您的其余处理,我们可能会建议替代方案。
- 亚当
答案 6 :(得分:0)
普通的高斯消除可以很好地发挥作用。
这取决于您正在使用的库/类/结构。您可以查看GSL。
答案 7 :(得分:-2)
如果矩阵表示仿射变换(只要你没有引入缩放分量,很多时候这就是4x4矩阵的情况),反转就是上3x3旋转部分的转置,最后一列被否定。显然,如果你需要一个通用的解决方案,那么研究高斯消元可能是最简单的。