我还需要映射另一种方式圆,所以我只是将矩阵求逆。当量值相差不大时,它可以工作,但是当行列式太接近零而无法用标准双数表示时,它会失败。
我使用的矩阵形式为:
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
#1 楼
我找到了解决我特定问题的方法。我没有逐步计算行列式并碰到精度壁,而是逐步使用了Gauss-Jordan方法。在仿射变换矩阵和使用的值范围的特定情况下,我不使用这样会遇到任何精度问题。
评论
我没看到问题,双精度数可以表示小至10 ^ -308的数字。也许您的问题可能源于计算中的操作顺序。您可能会有类似(BigValue + SmallValue)-BigValue的东西,而不是得到“ SmalValue”,而是得到0。
在我看来,您似乎实际上有一个旋转R,然后是平移T。如果可以将它们分开,则要获取Inverse(R * T),您只需执行Inverse(T)* Inverse(R) ,两者都是微不足道的。有帮助吗?
Simon,关于由不同数量的数字相乘而产生的问题,您是正确的。矩阵比R * T更复杂。它也是一个尺度,并且可以是任何仿射的乘积。.我设法解决了这个问题,但是,请参见下文。感谢您的帮助。
您应该在数学论坛上提问!