矩陣求逆的快速演算法

2021-06-06 05:04:09 字數 1524 閱讀 1803

前:

1、如果是正交矩陣,則它的轉置就是它的逆,

2、boost下面有庫(ublas)

basic linear algebra library

基本的線性代數都有了,你去看看吧

www.boost.org

3、對於2x2  3x3 公式,

演算法介紹

矩陣求逆在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)  } 

} if (abs(fmax) < 0.0001f) 

return 0; 

if (is[k] != k) 

if (js[k] != k) 

// 計算行列值 

fdet *= m(k, k); 

// 計算逆矩陣 

// 第二步 

m(k, k) = 1.0f / m(k, k); 

// 第三步 

for (dword j = 0; j < 4; j ++) 

// 第四步 

for (dword i = 0; i < 4; i ++)  } 

} // 第五步 

for (i = 0; i < 4; i ++)  } 

for (k = 3; k >= 0; k --) 

if (is[k] != k)  } 

mout = m; 

return fdet * f; }比較

原演算法原演算法(經過高度優化)

新演算法加法次數

10361

39乘法次數

170116

69需要額外空間

16 * sizeof(float)

34 * sizeof(float)

25 * sizeof(float)

結果不言而喻吧。

大數乘法求尾數的快速演算法

今天,在做zju的題目的時候遇到了大數乘法求尾數的問題。最後發現了,其實不需要把實際數值求出來就可以知道尾數。只要每次都記錄最後一位模10的結果就可以了。原理如下 求 n m k 的最後一位數字。把 n m和k轉換成 10 進製 n a0 10 0 a1 10 1 a2 10 2 ai 10 i m...

大數乘法求尾數的快速演算法

今天,在做zju的題目的時候遇到了大數乘法求尾數的問題。最後發現了,其實不需要把實際數值求出來就可以知道尾數。只要每次都記錄最後一位模10的結果就可以了。原理如下 求 n m k 的最後一位數字。把 n m和k轉換成 10 進製 n a0 10 0 a1 10 1 a2 10 2 ai 10 i m...

矩陣的求逆

最近做乙個加密演算法遇到需要計算矩陣的逆,閒著無聊,記錄一下,以後免得再麻煩。include include include define max 20 define e 0.000000001 計算矩陣src的模 double calculate a double src max int n fo...