程式扎記: [ numpy ] 線代概念 : 行列式 / 伴隨矩陣 / 反矩陣

標籤

2012年7月20日 星期五

[ numpy ] 線代概念 : 行列式 / 伴隨矩陣 / 反矩陣

行列式 : (Determinant
行列式 在數學中,是一個函數,其定義域為 nxn 的矩陣A,取值為一個純量,寫作或 det(A) 或 |A|. 對於簡單的2階和3階的矩陣,行列式的表達式相對簡單,而且恰好是每條主對角線(左上至右下)元素乘積之和減去每條副對角線(右上至左下)元素乘積之和(見圖中紅線和藍線): 
 
 

- 簡單範例 
求下面矩陣之行列式值 det(A) : 
 

答案為 -6, 如果你要使用 numpy 套件來計算, 可以如下: 
 

伴隨矩陣 : (adjugate matrix
線性代數中,一個方形矩陣的伴隨矩陣是一個類似於逆矩陣的概念. 如果矩陣可逆,那麼它的逆矩陣和它的伴隨矩陣之間只差一個係數. 在此之前先來看看了解 伴隨矩陣 需要知道的一些定義. 
- 定義 
考慮 A 是一個以 R 中元素為係數的 n×n 的矩陣. A的伴隨矩陣可按如下步驟定義 (參考至 wiki) : 
 

- 簡單範例 
來看看範例有助理解, 如果是二維矩陣 : 
 

如果是三維矩陣 : 
 

- Numpy 範例 
考慮下面的 adjugate matrix : 
 

使用 numpy 模組, 我們可以先建立一個函數 adjugate() 將傳入參數 matrix 以其對應的 adjugate matrix 回傳 : 
  1. def adjugate(matrix):  
  2.     import numpy as np  
  3.     C = np.zeros(matrix.shape)  # 初始化 Cofactor matrix    
  4.     nrows, ncols = C.shape      # 取出 Cofactor matrix 的 row,col  
  5.     # Loop to calculate Cofactor  
  6.     for row in xrange(nrows):  
  7.         for col in xrange(ncols):  
  8.             minor = matrix[np.array(range(row)+range(row+1,nrows))[:,np.newaxis],  
  9.                            np.array(range(col)+range(col+1,ncols))]  
  10.             C[row, col] = (-1)**(row+col) * np.linalg.det(minor)    # 計算 Cij | i=row,j=col  
  11.     return C.transpose()  
接著你便可以如下使用上面定義的函數計算 adjugate matrix : 
 

反矩陣 : (Invertible matrix
在線性代數中,給定一個 n 階方陣 ,若存在一 n 階方陣,使得 : 
 

則稱 A 是可逆的,且 B 是 A 的逆矩陣,記作 A^-1. 若方陣 A 的逆陣存在,則稱 A 為非奇異方陣或可逆方陣. 並且如果矩陣 A 可逆, 則 : 
 

- 反矩陣之性質 
 

- 簡單範例 
 

- Numpy 範例 
使用 numpy 模組, 可以如下取得某個 matrix 的 inverse matrix : 
 

或者你可以利用 伴隨矩陣 的特性 來求得 反矩陣 : 
 

其他 Numpy 矩陣操作 : 
底下是一些常見 numpy 上提供的 matrix 操作 : 

- n dimension 的 transpose 
你可以透過 numpy.core.defmatrix.matrix 上的方法或屬性取的該 matrix 的 transpose matrix : 
 

或者 ndarray 上也可進行同樣操作 : 
 

補充說明 : 
Speed up python code for computing matrix cofactors

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!