反转4x4矩阵-需要数值最稳定的解决方案

时间:2020-03-06 14:57:18  来源:igfitidea点击:

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

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

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

那么反转矩阵的最数值稳定的方法是什么?我不太在乎性能,但是简单地浮点运算会减慢我的目标体系结构。

解决方案

普通的高斯消去法会很好地工作。

这取决于我们使用的库/类/结构。我们可以看一下GSL。

为了最大程度地减少截断错误和其他弊端,请使用"旋转",请参见《数字配方》中有关反转矩阵的章节。到目前为止,它们是我找到的最好的解释。

我认为答案取决于矩阵的确切形式。具有固定点的标准分解方法(LU,QR,Cholesky等)在固定点上非常好,尤其是对于较小的4x4矩阵。参见Press等人的《数字食谱》一书。这些方法的说明。

本文提供了一些有用的算法,但不幸的是,这是背后的难题。他们建议使用(枢轴式)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矩阵。)

在定点精度方面,我们可能无法击败它。

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

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

我们可以考虑在执行常规算法之前将其加倍至1.31. 它将使乘法次数增加一倍,但是我们正在执行矩阵求逆,并且我们所做的任何事情都将与处理器中的乘法器紧密联系在一起。

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

如果我们给我们提供了矩阵求逆对我们有什么作用,以及它如何适合其余处理的想法,我们也许可以提出替代方案。

-亚当

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

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

即使必须为b的许多值一遍又一遍地求解Ax = b,将A取反仍然不是一个好主意。我们可以将A分解(例如LU分解或者Cholesky分解)并保存这些系数,这样我们就不必重做每次都可以使用,但是每次使用分解仍然可以解决系统问题。