2014-04-13 73 views
3

我掙扎在Python中創建以下列表:轉換MATLAB代碼爲蟒蛇的矩陣構建

| 1 -2 1 0 ... 0 | 
| 0 1 -2 1 ... ... | 
|... ... ... ... 0 | 
| 0 ... 0 1 -2 1 | 

我已經低於該MATLAB代碼似乎產生了這個矩陣(article),但我不能轉換它在Python代碼中。

Matlab代碼:

D2 = spdiags(ones(T-2,1)*[1 -2 1],[0:2],T-2,T); 

T是列數。

在Python代碼如下所示:

from scipy.sparse import spdiags 
D2 = spdiags((ones((T-2,1))*array([1,-2,1])),arange(0,3),T-2,T) 

後者產生以下錯誤:

ValueError: number of diagonals (327) does not match the number of offsets (3)

但是,如果我轉這樣的矩陣:

D2 = spdiags((ones((T-2,1))*array([1,-2,1])).T,arange(0,3),T-2,T) 

我得到以下結果:

matrix([[ 1., -2., 1., ..., 0., 0., 0.], 
     [ 0., 1., -2., ..., 0., 0., 0.], 
     [ 0., 0., 1., ..., 0., 0., 0.], 
     ..., 
     [ 0., 0., 0., ..., 1., 0., 0.], 
     [ 0., 0., 0., ..., -2., 0., 0.], 
     [ 0., 0., 0., ..., 1., 0., 0.]]) 

有人可以幫助我嗎?我錯在哪裏?

+0

你在用什麼T值?我並不完全知道發生了什麼,但值得注意的是,當評估第一個表達式時(<3x5稀疏矩陣類型'' \t與9個已存儲的值,T = 5會產生明顯好的結果元素(3個對角線)以Diorgonal格式> )。 – Daryl

+1

看到http://stackoverflow.com/questions/16030620/translate-matlab-code-to-python-scipy,似乎有人在做同樣的事情,並有他們的問題回答。 – Daryl

+0

我也發現這個問題。但實際上它仍然不適合我。 T可以在100以上。對於較小的T值,我可以看出這是有效的,但似乎並不完全。我預計矩陣的結尾會以'1 2 1'結尾,但實際上您可以看到它以'1 0 0'結尾。我沒有matlab來查看該函數如何創建矩陣。 –

回答

0

更改此:

D2 = spdiags((ones((T-2,1))*array([1,-2,1])).T,arange(0,3),T-2,T) 

這樣:

D2 = spdiags((ones((T,1))*array([1,-2,1])).T,arange(0,3),T-2,T) 
也就是說,所需的行中的第一個參數的長度,這是含有對角線陣列

,等於結果中的列數。

+0

這是與matlab /八度的區別!我設法以八度音階執行原始代碼,並且最終得到相同的矩陣以及修復後的預期結果。謝謝沃倫! –