【问题标题】:Inverse matrix calculation in real time实时逆矩阵计算
【发布时间】:2020-09-10 11:29:18
【问题描述】:

我一直在开发一个实时工作的 C 语言控制软件。该软件实现了受控系统的离散状态空间观察器等。为了实现观察者,有必要计算 4x4 维度的矩阵的逆矩阵。逆矩阵计算必须每 50 微秒进行一次,值得一提的是,在此期间还会进行其他相当耗时的计算。所以逆矩阵计算必须消耗少于 50 微秒的时间。还需要说的是,使用的DSP没有支持浮点运算的ALU。

我一直在寻找一些有效的方法来做到这一点。我的一个想法是准备计算矩阵4x4行列式的通用公式和计算4x4矩阵伴随矩阵的通用公式,然后根据下面给出的公式计算逆矩阵。

您如何看待这种方法?

【问题讨论】:

  • 你试过你的方法了吗?如果没有,为什么不呢?如果是,它是否满足您的性能要求?
  • 等式中缺少一些部分:真实世界的 CPU、时钟速度、它正在做的其他工作、中断延迟、它如何读取/写入数据结果、数据格式等。从找出现实世界的硬件限制开始。
  • @Steve 如果要求它应该在不支持浮点的机器上执行低于 50 毫秒,那么这是一个非常重要的事情,应该是问题的一部分。
  • 您的目标是否可以使用浮点运算?定点算术可用吗?它是哪个DSP?我们需要一些规格。
  • 对于问题的定点部分,有几个地方可以获得有关如何调整 C 程序以与定点处理器兼容的信息。这里有几个:(第一个似乎最实用。)fixed-point math in CFloatingPointtoFixedPointConversionofC CodeConverting between integer and float data representations

标签: c matrix embedded matrix-inverse


【解决方案1】:

据我了解,研究数值线性代数的人的共识是,建议避免不必要地计算矩阵求逆。例如,如果 A 的逆仅出现在控制器中,例如

z = inv(A)*y

那么最好(更快,更准确)求解 z 方程

A*z = y 

而不是计算 inv(A),然后将 y 乘以 inv(A)。

求解此类方程的常用方法是将 A 分解为更简单的部分。例如,如果 A 是(严格)正定的,那么 cholesky factorization 会找到下三角矩阵 L,因此

A = L*L'

鉴于我们可以通过以下方式解决 Z 的 A*z=y:

solve L*u = y for u
solve L'*z = u for z

鉴于 L 的三角形性质,每一个都很容易

另一个因式分解(同样仅适用于正定矩阵)是 LDL,在您的情况下它可能更容易,因为它不涉及平方根。上面链接的 wiki 文章中对此进行了描述。

更通用的因式分解包括LUDQR,它们更通用,因为它们可以应用于任何(可逆)矩阵,但比cholesky 慢一些。

这种因式分解也可用于计算逆。

在您的帖子中将 adj(A) 描述为迂腐,因为伴奏可能有点过时;我觉得 adjugate 或 adjunct 更现代。在任何情况下,adj(A) 都不是转置。而是 adj(A) 的 (i,j) 元素,直到一个符号,是通过删除第 i 行和第 j 列从 A 获得的矩阵的行列式。有效地计算这个很尴尬。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    相关资源
    最近更新 更多