#python #matlab #scipy #sparse-matrix
#python #matlab #scipy #разреженная матрица
Вопрос:
Я немного новичок как в 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
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, даже если размеры массива больше определенного размера матрицы…
Что я делаю не так? Я, очевидно, что-то напортачил… Заранее большое спасибо за любую помощь!
Ответ №1:
Проблема в том, что индексы 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)
Тем не менее, лучше проверить это перед использованием…
Комментарии:
1. Хм… Я не думаю, что это проблема, с которой я столкнулся, потому что len (j) = 5734400 (чего я и хочу), и я хочу j[0] = 1
2.@NJM: длина
j
не проблема, ноmax(j) = 57344
.j
содержит информацию о столбце, и если под «1» вы подразумеваете первый столбец, то вы, безусловно, хотели бы использоватьj[0]=0
Python. Проверьте эту ссылку на наличие различий между Python (numpy amp; scipy) и Matlab: scipy.org/NumPy_for_Matlab_Users3. Ах, я понимаю, что вы сейчас говорите. Похоже, мне, возможно, придется также просмотреть мою переменную phaseorigin, поскольку ее значение max() также равно 57344.00. Спасибо.