2011-10-13 14 views
2

我有點新手既Matlab的和Python的等等,很多道歉,如果這個問題有點愚蠢......問題將Matlab的稀疏()代碼numpy的/ SciPy的與csc_matrix()

我試圖用numpy和scipy將一些Matlab代碼轉換爲Python,並且事情一直很好,直到我到達有人寫的稀疏矩陣。 Matlab代碼如下所示:

unwarpMatrix = sparse(phaseOrigin, ceil([1:nRead*nSlice*nPhaseDmap]/expan), 1, numPoints, numPoints)/expan; 

這是我的Python代碼(與我的思考過程)導致我嘗試轉換。對於給定的數據集I與測試(在Matlab和Python)的:

NREAD = 64
nslice = 28
nphasedmap = 3200
EXPAN = 100
爲NumPoints = 57344

因此, phaseorigin,S的長度,並且j陣列5734400(和我們已確認創建我phaseorigin陣列輸出完全相同的結果Matlab的確實的功能)

#Matlab sparse takes: S = sparse(i,j,s,m,n) 
#Generates an m by n sparse matrix such that: S(i(k),j(k)) = s(k) 

#scipy csc matrix takes: csc_matrix((data, ij), shape=(M, N)) 

#Matlab code is: unwarpMatrix = sparse(phaseOrigin, ceil([1:nRead*nSlice*nPhaseDmap]/expan), 1, numPoints, numPoints)/expan; 
size = nread*nslice*nphasedmap 

#i would be phaseOrigin variable 
j = np.ceil(np.arange(1,size+1, dtype=np.double)/expan) 

#Matlab apparently treats '1' as a scalar so I should be tiling 1 to the same size as j and phaseorigin 
s = np.tile(1,size) 

unwarpmatrix = csc_matrix((s,(phaseorigin, j)), shape=(numpoints,numpoints))/expan 

所以當我嘗試運行我的Python代碼我得到:

ValueError: column index exceedes matrix dimensions 

這當我運行,即使數組大小比定義的矩陣規模較大的Matlab代碼不會發生......

我究竟做錯了什麼?我顯然已經搞砸了......非常感謝您的幫助!

回答

2

問題是; Python索引從0開始,而Matlab索引從1開始。因此對於大小爲57344array,在Python中,第一個元素是arr[0],最後一個元素是arr[57343]

您變量j的值從157344。你可能會看到這個問題。創建你j這樣可以解決這個問題:

j = np.floor(np.arange(0,size, dtype=np.double)/expan) 

然而,良好的使用之前檢查這個...

+0

嗯...我不認爲這是我有,因爲LEN(問題j)= 5734400(這是我想要的),並且我確實需要j [0] = 1 – NJM

+0

@NJM:'j'的長度不是問題,而是'max(j)= 57344'。 'j'保存列信息,如果用「1」表示*第一列*,那麼你肯定會希望在Python **中使用'j [0] = 0' **。檢查這個鏈接的Python(numpy&scipy)和Matlab之間的差異:http://www.scipy.org/NumPy_for_Matlab_Users – Avaris

+0

啊,我明白你現在說的話。它看起來像我可能需要查看我的phaseorigin變量,因爲它的max()似乎也是57344.00。謝謝。 – NJM