我正在使用仿射变换矩阵将2D坐标从屏幕(幅度10e3)转换为分形集的一小部分(幅度小至10e-15)。

我还需要映射另一种方式圆,所以我只是将矩阵求逆。当量值相差不大时,它可以工作,但是当行列式太接近零而无法用标准双数表示时,它会失败。

我使用的矩阵形式为:

a c e
b d f
0 0 1


我拥有的反演算法是:

var dt = a * d - b * c;
return new Matrix(d/dt, -b/dt, -c/dt, a/dt, (c * f - d * e) / dt, -(a * f - b * e) / dt);


是否有另一种求矩阵求逆的方法?我不太擅长数学,所以我需要一个简单的解决方案,然后我就可以找到相应的代码或算法。

此类矩阵的示例:

 3.26091378894248e-9   -1.882689453850103e-9   -0.7172216437740687
-1.882689453814925e-9  -3.2609137888815494e-9  -0.23371832131832268
 0                      0                       1


评论

我没看到问题,双精度数可以表示小至10 ^ -308的数字。

也许您的问题可能源于计算中的操作顺序。您可能会有类似(BigValue + SmallValue)-BigValue的东西,而不是得到“ SmalValue”,而是得到0。

在我看来,您似乎实际上有一个旋转R,然后是平移T。如果可以将它们分开,则要获取Inverse(R * T),您只需执行Inverse(T)* Inverse(R) ,两者都是微不足道的。有帮助吗?

Simon,关于由不同数量的数字相乘而产生的问题,您是正确的。矩阵比R * T更复杂。它也是一个尺度,并且可以是任何仿射的乘积。.我设法解决了这个问题,但是,请参见下文。感谢您的帮助。

您应该在数学论坛上提问!

#1 楼

我找到了解决我特定问题的方法。我没有逐步计算行列式并碰到精度壁,而是逐步使用了Gauss-Jordan方法。

在仿射变换矩阵和使用的值范围的特定情况下,我不使用这样会遇到任何精度问题。