一千萬個為什麽

搜索

高效的4x4矩陣逆(仿射變換)

我希望有人可以為4x4仿射矩陣變換指出一個有效的公式。目前我的代碼使用輔助因子擴展,並為每個輔助因子分配一個臨時數組。它易於閱讀,但速度比應有的慢。

請註意,這不是功課,我知道如何使用4x4輔助因子擴展手動完成它,這只是一個痛苦,對我來說並不是一個真正有趣的問題。我也用谷歌搜索了一些網站,它們已經為你提供了公式( http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )。然而,通過預先計算一些產品,可能會進一步優化這一點。我敢肯定有人在某個時刻想出了“最佳”的公式嗎?

最佳答案

你應該能夠利用矩陣是仿射的事實來加速完全反轉。也就是說,如果您的矩陣看起來像這樣

A = [ M   b  ]
    [ 0   1  ]

其中A是4x4,M是3x3,b是3x1,底行是(0,0,0,1),那麽

inv(A) = [ inv(M)   -inv(M) * b ]
         [   0            1     ]

根據您的情況,計算inv(A)* x的結果可能更快,而不是實際形成inv(A)。在這種情況下,事情簡化為

inv(A) * [x] = [ inv(M) * (x - b) ]
         [1] = [        1         ] 

其中x是3x1向量(通常是3D點)。

最後,如果M代表一個旋轉(即它的列是正交的),那麽你可以使用inv(M)= transpose(M)的事實。然後計算A的倒數只是減去平移分量,並乘以3x3部分的轉置。

請註意,矩陣是否是正交矩陣是您應該從問題分析中了解到的。在運行時檢查它會相當昂貴;雖然您可能希望在調試版本中執行此操作以檢查您的假設是否成立。

希望所有這一切都很清楚......

轉載註明原文: 高效的4x4矩陣逆(仿射變換)