使用csc_matrix()将Matlab sparse()代码转换为numpy / scipy的问题

时间:2011-10-13 21:59:42

标签: python matlab scipy sparse-matrix

我对Matlab和Python都是一个新手,所以,如果这个问题有点愚蠢,很多道歉......

我正在尝试使用numpy和scipy将一些Matlab代码转换为Python,并且事情进展顺利,直到我到达有人写的稀疏矩阵。 Matlab代码如下:

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

这是我的python代码(通过我的思考过程)导致我尝试转换。对于给定的数据集,我正在测试(在Matlab和Python中):

nread = 64
nslice = 28
nphasedmap = 3200
expand = 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代码时也不会发生这种情况......

我做错了什么?我显然搞砸了一些事情......非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

问题是; Python索引从0开始,而Matlab索引从1开始。因此对于大小为array的{​​{1}},在Python中,第一个元素为57344,最后一个元素为arr[0]

您的变量arr[57343]的值为j1。你可能看到了这个问题。像这样创建57344可以解决问题:

j

不过,最好在使用之前检查一下......