我对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代码时也不会发生这种情况......
我做错了什么?我显然搞砸了一些事情......非常感谢您的帮助!
答案 0 :(得分:2)
问题是; Python索引从0
开始,而Matlab索引从1
开始。因此对于大小为array
的{{1}},在Python中,第一个元素为57344
,最后一个元素为arr[0]
。
您的变量arr[57343]
的值为j
到1
。你可能看到了这个问题。像这样创建57344
可以解决问题:
j
不过,最好在使用之前检查一下......