快速和向后稳定(左)


10

我需要计算很多 3×3 矩阵逆(用于牛顿迭代极坐标分解),具有极少数退化案例(<0.1%)。

显式逆(通过矩阵次要除以行列式)似乎有效,大约是32到40个融合触发器(取决于我如何计算行列式的倒数)。不考虑det比例因子,它只有18个融合触发器(9个元素中的每个都是ab-cd形式,2个融合触发器)。

题:

  • 有没有一种方法可以计算 3×3 使用少于18个(具有任意标度)或32个(具有适当标度,考虑倒数1 op)的融合触发器?
  • 有没有一种经济的方法(使用〜50 f-flops)来计算a的向后稳定左反转 3×3 矩阵?

我正在使用单精度浮点数(iOS游戏)。向后稳定性对我来说是一个有趣的新概念,我想尝试一下。这是引起这一想法的文章


将Cayley-Hamilton定理用于反函数呢?
nicoguaro

1
如果这是您的瓶颈,那么在这种情况下,另一种用于极性分解的算法会更快吗?例如通过SVD?还是像eprints.ma.man.ac.uk/694/01/covered/MIMS_ep2007_9.pdf 3.3中那样加速牛顿法?
基里尔

Answers:


5

我将尝试就第一个有关快速的问题提出想法3×3倒数。考虑

A=[adgbehcfi]

由于矩阵很小且非常笼统(不具有任何已知的结构,零,元素的相对比例),我认为不可能给出任意比例的算法(没有 1/det(A))快于18个融合触发器的逆,因为9个元素中的每一个都需要2个融合触发器,并且所有乘积都是唯一的,前提是没有关于 A的条目 a,,i

A1det(A)=adj(A)=[eifhdifggedhbichaicgahbgcebfafcdaebd]
这里, adj(A) 表示佐剂(辅因子的转置),本质上是带有“任意标度”的逆(前提是存在逆)。

但是,可以将某些计算重新用于计算 det(A)。如果我将其扩展到第一列(还有5个选择):

det(A)=a(eifh)+b(fgdi)+c(dhge)=a(eifh)b(difg)c(gedh)
请注意,(*)已经在对 adj(A)。因此,行列式的倒数可以在4个附加的融合触发器中进行计算(如果1/det(A) 倒数被视为1翻牌)。

现在, adj(A) 应该通过已经获得的行列式倒数来缩放,再加上9个融合触发器。

所以,

  1. 计算 adj(A) 在18个熔合拖鞋中
  2. 计算 det(A) 使用已经计算的条目在3个融合翻牌中 adj(A)
  3. 1det(A) (假设1次翻牌)。
  4. 缩放已计算的每个元素 adj(A) 通过 1det(A) 在另外9个翻牌圈中

结果是18 + 3 + 1 + 9 = 31个融合翻牌。您没有描述计算行列式的方式,但是我想可以再节省1次翻牌。或者可以用来执行检查|det(A)|>ϵ 在第3步中 ϵ退化(不可逆)情况的容差,导致 32个融合flop(假设if为1 flop)。

我认为没有更快的方法可以计算a的逆 3×3通用矩阵,因为所有剩余的计算都是唯一的。从速度的角度来看,使用Cayley-Hamilton应该无济于事,因为通常它需要计算A2 为一个 3×3 矩阵以及其他一些操作。

注意:

  • 这个答案不涉及数值稳定性
  • 也没有讨论矢量化和优化内存访问模式的可能潜力
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.