【问题标题】:Invert 4x4 matrix - Numerical most stable solution needed反转 4x4 矩阵 - 需要数值最稳定的解决方案
【发布时间】:2010-09-14 09:58:45
【问题描述】:

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

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

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

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

【问题讨论】:

  • 普通的旧高斯消除会很好用。这取决于您使用的库/类/结构。你可以看看GSL
  • 矩阵中元素的大小是否接近?
  • 为了最大限度地减少截断错误和其他不良情况,请使用“旋转” - 请参阅数值配方中关于反转矩阵的章节。他们有我迄今为止找到的最好的解释。
  • 不——不幸的是他们到处都是。
  • 你有矩阵的近似条件数吗?我在回答中引用的论文成功达到了几百个条件数,尽管这是针对 8x8 或 32x32 矩阵,所以你可能会做得比这更好。

标签: language-agnostic matrix linear-algebra fixed-point matrix-inverse


【解决方案1】:

元答案:它真的是一个通用的 4x4 矩阵吗?如果您的矩阵具有特殊形式,则有直接的求逆公式可以快速并让您的运算倒计时。

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

[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 矩阵。)

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

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

【讨论】:

  • 如果涉及缩放因子,我认为这不起作用?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      如果您告诉我们矩阵求逆对您有什么作用,以及它如何与您的其余处理相适应,我们或许可以提出替代方案。

      -亚当

      【讨论】:

      • 使用符号数学程序来反转通用矩阵,它应该提供可以更容易计算的公式。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 这个答案不正确。请参阅 Adrian 的答案,寻找正确的答案,朝着相同的方向前进。
        猜你喜欢
        • 2010-11-12
        • 2014-09-09
        • 2018-12-02
        • 2020-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多