詳細講解矩陣求逆的快速演算法(轉)
詳細講解矩陣求逆的快速演算法(轉)[@more@] 演算法介紹 矩陣求逆在3D程式中很常見,主要應用於求Billboard矩陣。按照定義的計算方法乘法運算,嚴重影響了效能。在需要大量Billboard矩陣運算時,矩陣求逆的最佳化能極大提高效能。這裡要介紹的矩陣求逆演算法稱為全選主元高斯-約旦法。 高斯-約旦法(全選主元)求逆的步驟如下: 首先,對於 k 從 0 到 n - 1 作如下幾步: 從第 k 行、第 k 列開始的右下角子陣中選取絕對值最大的元素,並記住次元素所在的行號和列號,在透過行交換和列交換將它交換到主元素位置上。這一步稱為全選主元。 m(k, k) = 1 / m(k, k) m(k, j) = m(k, j) * m(k, k),j = 0, 1, ..., n-1;j != k m(i, j) = m(i, j) - m(i, k) * m(k, j),i, j = 0, 1, ..., n-1;i, j != k m(i, k) = -m(i, k) * m(k, k),i = 0, 1, ..., n-1;i != k 最後,根據在全選主元過程中所記錄的行、列交換的資訊進行恢復,恢復的原則如下:在全選主元過程中,先交換的行(列)後進行恢復;原來的行(列)交換用列(行)交換來恢復。 實現(4階矩陣) float Inverse(CLAYMATRIX& mOut, const CLAYMATRIX& rhs) { CLAYMATRIX m(rhs); DWORD is[4]; DWORD js[4]; float fDet = 1.0f; int f = 1; for (int k = 0; k < 4; k ++) { // 第一步,全選主元 float fMax = 0.0f; for (DWORD i = k; i < 4; i ++) { for (DWORD j = k; j < 4; j ++) { const float f = Abs(m(i, j)); if (f > fMax) { fMax = f; is[k] = i; js[k] = j; } } } if (Abs(fMax) < 0.0001f) return 0; if (is[k] != k) { f = -f; swap(m(k, 0), m(is[k], 0)); swap(m(k, 1), m(is[k], 1)); swap(m(k, 2), m(is[k], 2)); swap(m(k, 3), m(is[k], 3)); } if (js[k] != k) { f = -f; swap(m(0, k), m(0, js[k])); swap(m(1, k), m(1, js[k])); swap(m(2, k), m(2, js[k])); swap(m(3, k), m(3, js[k])); } // 計算行列值 fDet *= m(k, k); // 計算逆矩陣 // 第二步 m(k, k) = 1.0f / m(k, k); // 第三步 for (DWORD j = 0; j < 4; j ++) { if (j != k) m(k, j) *= m(k, k); } // 第四步 for (DWORD i = 0; i < 4; i ++) { if (i != k) { for (j = 0; j < 4; j ++) { if (j != k) m(i, j) = m(i, j) - m(i, k) * m(k, j); } } } // 第五步 for (i = 0; i < 4; i ++) { if (i != k) m(i, k) *= -m(k, k); } } for (k = 3; k >= 0; k --) { if (js[k] != k) { swap(m(k, 0), m(js[k], 0)); swap(m(k, 1), m(js[k], 1)); swap(m(k, 2), m(js[k], 2)); swap(m(k, 3), m(js[k], 3)); } if (is[k] != k) { swap(m(0, k), m(0, is[k])); swap(m(1, k), m(1, is[k])); swap(m(2, k), m(2, is[k])); swap(m(3, k), m(3, is[k])); } } mOut = m; return fDet * f; } 比較 原演算法 原演算法 (經過高度最佳化) 新演算法 加法次數 103 61 39 乘法次數 170 116 69 需要額外空間 16 * sizeof(float) 34 * sizeof(float) 25 * sizeof(float) 結果不言而喻
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-952044/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 矩陣求逆矩陣
- 矩陣分解--超詳細解讀矩陣
- 矩陣求導公式【轉】矩陣求導公式
- 演算法學習:矩陣快速冪/矩陣加速演算法矩陣
- 奇異矩陣,非奇異矩陣,偽逆矩陣矩陣
- 求任意矩陣的伴隨矩陣矩陣
- 伴隨矩陣和逆矩陣的關係證明矩陣
- 矩陣類及其常規運算(加、減、乘、轉置、求逆、行列式、代數餘子式、伴隨矩陣)矩陣
- 機器學習中的矩陣向量求導(五) 矩陣對矩陣的求導機器學習矩陣求導
- numpy.linalg包函式用法集錦(求逆矩陣,求矩陣行列式的值,求特徵值和特徵向量,解方程組)函式矩陣特徵
- 演算法--揹包九講(詳細講解+程式碼)演算法
- 矩陣求導矩陣求導
- python輸入詳解(陣列、矩陣)Python陣列矩陣
- A*演算法(超級詳細講解,附有舉例的詳細手寫步驟)演算法
- 指標的詳細講解指標
- 矩陣快速冪矩陣
- 【矩陣求導】關於點乘 (哈達瑪積)的矩陣求導矩陣求導點乘
- 矩陣求導(二)矩陣求導
- 矩陣求導(一)矩陣求導
- 資料結構:陣列,稀疏矩陣,矩陣的壓縮。應用:矩陣的轉置,矩陣相乘資料結構陣列矩陣
- dart類詳細講解Dart
- Java中的static詳細講解Java
- react的詳細知識講解!React
- (詳細圖解) 逆波蘭表示式圖解
- Tarjan演算法及其應用 總結+詳細講解+詳細程式碼註釋演算法
- 矩陣轉置矩陣
- 矩陣求最短路徑矩陣
- 【DAPP】佛薩奇2.0矩陣互助開發詳情丨佛薩奇制度系統開發細節講解APP矩陣
- Go Struct超詳細講解GoStruct
- 使用世界變換的逆轉置矩陣對法線進行變換矩陣
- 矩陣快速冪總結矩陣
- 矩陣快速冪(快忘了)矩陣
- 機器學習中的矩陣向量求導(四) 矩陣向量求導鏈式法則機器學習矩陣求導
- 演算法-陣列與矩陣演算法陣列矩陣
- POJ 3613 Cow Relays 矩陣乘法Floyd+矩陣快速冪矩陣
- zip矩陣轉至矩陣
- 面試官:講講雪花演算法,越詳細越好面試演算法
- DeFi和CeFi的區別詳細講解
- 詳細講解函式呼叫原理函式