2009年3月5日 星期四

反矩陣(inverse matrix)運算

在介紹反矩陣運算之前,需要先知道矩陣的加減乘法是怎麼運作,才有辦法理解反矩陣的運算規則。

並不是每一個矩陣都會有反逆陣,如果有反矩陣則稱此矩陣是可逆的(invertible)或是非奇異的(nonsingular),反之則稱之奇異的(singular)。

由於矩陣只有加減乘法,並沒有除法運算,所以我們如果需要計算兩矩陣相除時,

需先將除數的矩陣轉換為逆矩陣再做相乘運算即可得到同樣的結果。


由於自己怕忘記實作的反矩陣到底是怎麼實作的,以及所實作的方法又是什麼?因此在這邊加以說明。

反矩陣的算法有很多種(高斯消去法、伴隨矩陣/行列式(adj(A)/|A|).....等),而我所用的則是「高斯消去法」,主要就是運用單位矩陣 In,來達成目的。

底下列出實作的程式碼內容,由於本實作沒有運用分數計算的觀念,因此會有些許小數點誤差,但是其觀念並無錯誤。



double[][] mtr = {{10,10,5},{10,30,15},{5,15,20}};
double[][] inv = {{1,0,0},{0,1,0},{0,0,1}};
double temp = 0;
for(i = 0 ; i < mtr.length ; i++){
temp = mtr[i][i];
for(j = 0 ; j < mtr[i].length ; j++){
mtr[i][j]/=temp;
inv[i][j]/=temp;
}
for(j = 0 ; j < mtr.length ; j++){
if(i!=j){
temp = mtr[j][i];
for(k = 0 ; k < mtr[j].length ; k++){
mtr[j][k]-= temp * mtr[i][k];
inv[j][k]-= temp * inv[i][k];
}
}
}
}

沒有留言:

張貼留言