Невозможно воспроизвести индексирование стиля Numpy в MATLAB - PullRequest
0 голосов
/ 28 сентября 2018

Вот код Python, который я пытаюсь воспроизвести в MATLAB.

>>> M = np.zeros((5,5))
>>> indices = np.arange(5)
>>> M[indices[:-1], indices[:-1]+1] = 1
>>> print(M)
[[0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0.]]

Вот что происходит, когда я пишу его в MATLAB.

>> M = zeros(5);
>> indices = 1:5;
>> M(indices(1:end-1), indices(1:end-1)+1) = 1
>>
M =

     0     1     1     1     1
     0     1     1     1     1
     0     1     1     1     1
     0     1     1     1     1
     0     0     0     0     0

Как можно добиться того жеэффект индексации в MATLAB?

1 Ответ

0 голосов
/ 28 сентября 2018

MATLAB 2D-индексирование извлекает прямоугольную подматрицу, в которой ее строки и столбцы переупорядочиваются на основе предоставленных векторов индекса.Но если у вас есть список строк и столбцов и вы хотите извлечь соответствующие элементы, вы должны преобразовать 2D-индекс в линейный индекс, и для него вы можете использовать sub2ind :

M = zeros(5);
indices = 1:5;
idx = sub2ind([5,5],indices(1:end-1), indices(1:end-1)+1);
M(idx) = 1

В качестве альтернативы выможно напрямую использовать линейное индексирование:

M = zeros(5);
M(5+1:5+1:end) = 1

Как работает линейное индексирование?В MATLAB данные хранятся в главном формате столбца:

1    6   11   16   21
2    7   12   17   22
3    8   13   18   23
4    9   14   19   24
5   10   15   20   25

Когда вы используете диапазон 6:6:end, это означает, что вы хотите запустить элемент формы 6 с размером шага 6, чтобы извлечь элементы, поэтому вам нужны элементы [6 12 18 24].Эту схему индексации можно распространить на массивы ND и неквадратные матрицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...