前:
1、如果是正交矩陣,則它的轉置就是它的逆,
2、boost下面有庫(ublas)3、對於2x2 3x3 公式,basic linear algebra library
基本的線性代數都有了,你去看看吧
www.boost.org
演算法介紹
矩陣求逆在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...