2017-02-14 95 views
0

我有一個nxn矩陣C並使用invnumpy.linalg取相反得到Cinverse。我的C矩陣具有訂單10**4的元素,但我的Cinverse矩陣具有訂單10**12和更高的元素(不確定這是否正確)。當我做numpyp.dot(C,Cinverse)時,我沒有得到身份矩陣。爲什麼是這樣?numpy/python中的矩陣求逆沒有給出正確的矩陣?

我有一個向量x,我自己乘以得到一個矩陣。

x=array([ 121.41191662, 74.22830468, 73.23156336, 75.48354975, 
    79.89580817]) 
c=np.outer(xvector,xvector) 

這是一個5x5矩陣。

然後我通過

from numpy.linalg import inv 
cinverse=inv(c) 

得到它的反話,我想看看我是否能得到單位矩陣回來。

identity=np.dot(C00,C00inv) 

但是,我沒有得到單位矩陣。 cinverse具有非常大的矩陣元素 大約10 ** 13和更高,而c具有大約10,000的矩陣元素。

+4

請更具體一些。你能告訴我們你的輸入和輸出嗎?另外,你使用的是什麼代碼? –

+0

你可以用隨機矩陣提供一些示例代碼來展示你正在嘗試做什麼嗎?這聽起來不對 - 當你說有10 ** 4號的元素時,這是否意味着那個元素的數量是數字的大小,即10000ish?啊,juanpa,打我吧;) – RexFuzzle

+0

*「我沒有得到身份矩陣」* - 如何*關閉*是否對身份?由於舍入誤差,你不應該期望一個正好是1和0的矩陣。 –

回答

0

所以這裏有一些代碼可以生成逆矩陣,之後我會對它進行評論。

import numpy as np 
x = np.random.rand(5,5)*10000 # makes a 5x5 matrix with elements around 10000 
xin = np.linalg.inv(x) 
iden = np.dot(x,xinv) 

現在你iDEN的基質的第一行可能看起來是這樣的: [ 1.00000000e+00, -2.05382445e-16, -5.61067365e-16, 1.99719718e-15, -2.12322957e-16] 。請注意,第一個元素正好是1,因爲它應該是,但其他元素不完全是0,但它們基本上爲零,並且根據機器精度應視爲零。

+0

嗨@RexFuzzle,如果這些都是我的結果,我會很高興。我的向量是x = array([4140.56172552,2561.7498602,2529.56826173,2607.35090233, 2759.5614813])。我通過使用c = np.outer(x,x)得到我的矩陣,然後使用cinv = inv(c)來反轉。然後使用np.dot(c,cinv)我的第一行是[6.01898362e-01,5.53081985e + 00,1.79258876e + 00, -5.86243807e-01,1.50883747e + 01]這不是標識 –

1

兩個向量的外積(是否相同)是而不是是可逆的。由於它只是同一個矢量的縮放副本的堆棧,因此它的等級是1。排名有缺陷的矩陣cannot be inverted

我很驚訝,numpy沒有引發異常或至少發出警告。

+0

爲什麼這個?如果你看https://academic.oup.com/ptep/article/doi/10.1093/ptep/ptu065/1560725/CMB-foreground-A-concise-review#ref-17的eqn 14,你會看到我需要創建協方差矩陣的兩個向量的外積(我只是考慮l = m = 0的情況)。公式13要求我採取相反的做法 –

+0

@NabeelEh但是你確實得到了我相信的數學論證?無論這篇文章是怎麼說的。如果您有多個維度,則外部產品不可逆。這是事實。現在我真的不能期望爲你閱讀你的文件,但這是一次:你在那裏(14)是不是外部產品。它是一種外部產品。顯然,如果添加足夠的一級矩陣,您可以獲得滿秩。 –

+0

我明白了。是的,我得到了這個觀點。感謝保羅,感謝幫助! –