2013-05-30 521 views
1

我想要使用numpy/scipy獲得轉換後的數組包含n * m數組中的單位矩陣。如何將矩陣轉換爲包含單位矩陣的矩陣

from n*m matrix 
array([[ a, b, c, d, e, f], 
     [ g, h, i, j, k, l], 
     [ m, n, o, p, q, r]]) 

to 

array([[ 1, 0, 0, a', b', c'], 
     [ 0, 1, 0, d', e', f'], 
     [ 0, 0, 1, g', h', i']]) 

陣列中有單位矩陣陣,我想要那些陣列。

高斯約旦算法和高斯消去算法可以將矩陣變換爲包含單位矩陣的矩陣。但是這不能轉化任何n * m矩陣,並且在numpy/scipy中沒有轉換函數。

任何人都知道很好的解決方案?

+0

允許哪些轉換步驟?反轉矩陣時還使用了哪些? – Alfe

+0

一切正常,當然逆矩陣是 –

回答

0

高斯算法仍然可以應用,因爲它可以通過僅組合輸入線來完成。那麼在給定行末尾的附加值數目並不重要。

例不用於零檢查步驟(即怎麼做,如果所有值都≠0。):

a b c d e f 
g h i j k l 
m n o p q r 

1 b/a c/a d/a e/a f/a  (that's I/a) 
0 h-bg/a i-cg/a j-dg/a k-eg/a l-fg/a (that's II - I*g/a)) 
0 n-bm/a o-cm/a p-dm/a q-em/a r-fm/a (that's III - I*m/a) 

etc. 

我希望現在的方式是明確的。當然,你必須檢查零(也可以換行)以避免被它們分開,但這是應用高斯的正常方式。

+0

哦,我忘了基本因爲我專注於尋找合適的功能。這是很好的解決方案。謝謝 –

0

如果numpy.linalg是允許的,然後

import numpy as np 
n, m = A.shape 
assert n < m 
B = np.linalg.solve(A[:, :n], A[:, n:]) 
C = np.hstack((np.identity(n), B)) 

會做你的工作。

+0

謝謝,但它沒有工作(例如3 * 6大小的矩陣)。其代碼引發_LinAlgError:奇異矩陣_。 –

+0

我的變換是'C = inv(A [:,,,,,]] * A'這意味着行被組合在一起而不會對列進行置換。對不起,如果這不夠一般。 –