Ошибка преобразования кода Matlab sparse () в numpy / scipy с помощью csc_matrix () - PullRequest
2 голосов
/ 14 октября 2011

Я немного новичок и в Matlab, и в Python, поэтому, многие извинения, если этот вопрос немного тупой ...

Я пытаюсь преобразовать некоторый код Matlab в Python, используя numpy и scipy, и все шло хорошо, пока я не достиг разреженной матрицы, которую кто-то написал. Код Matlab выглядит так:

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

Вот мой код на python (с моим мыслительным процессом), приведший к моей попытке преобразования. Для данного набора данных, с которым я тестировал (в Matlab и Python):

Nread = 64
nslice = 28
nphasedmap = 3200
расширение = 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 Ответ

2 голосов
/ 14 октября 2011

Проблема в том,Индексы Python начинаются с 0, тогда как индексы Matlab начинаются с 1.Таким образом, для array размера 57344 в Python первый элемент будет arr[0], а последний элемент будет arr[57343].

Ваша переменная j имеет значения от 1 до 57344.Вы, наверное, видите проблему.Создание вашего j таким образом решило бы проблему:

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

Тем не менее, лучше проверить это перед использованием ...

...