Вот как я понял это из-за того, что немного возился. Рад быть исправленным и надеюсь, что это поможет.
Скажем, у вас есть матрица M из 2х3 элементов. Это имеет два измерения, очевидно.
Я не видел никакой разницы между Matlab и Python, когда просил манипулировать входной матрицей по измерениям, которые уже есть у матрицы.
Таким образом, две команды
repmat(M,m,n) % matlab
np.tile(M,(m,n)) # python
действительно эквивалентны для матрицы ранга 2 (два измерения).
Ситуация становится нелогичной, когда вы запрашиваете повторение / разбиение мозаики на большее количество измерений, чем имеет входная матрица. Возвращаясь к матрице М ранга два и формы 2х3, достаточно взглянуть на то, что происходит с размером / формой выходной матрицы. Скажем, последовательность манипуляций теперь 1,1,2.
В Matlab
> size(repmat(M,1,1,2))
ans =
2 3 2
он скопировал первые два измерения (строки и столбцы) входной матрицы и повторил это один раз в новое третье измерение (то есть дважды скопировал). Верно названию repmat
для повторной матрицы.
В Python
>>> np.tile(M,(1,1,2)).shape
(1, 2, 6)
он применил другую процедуру, поскольку, как я полагаю, последовательность (1,1,2) читается иначе, чем в Matlab. Количество копий в направлении столбцов, строк и внеплоскостных измерений читается справа налево. Полученный объект имеет форму, отличную от Matlab. Больше нельзя утверждать, что repmat
и tile
являются эквивалентными инструкциями.
Чтобы tile
вел себя как repmat
, в Python необходимо убедиться, что входная матрица имеет столько измерений, сколько элементов в последовательности. Это делается, например, путем небольшой предварительной подготовки и создания связанного объекта N
N = M[:,:,np.newaxis]
Затем на входной стороне имеется N.shape = (2,3,1)
вместо M.shape = (2,3)
, а на выходной
>>> np.tile(N,(1,1,2)).shape
(2, 3, 2)
который был ответом size(repmat(M,1,1,2))
. Я предполагаю, что это потому, что мы указали Python добавить третье измерение справа от (2,3), а не слева, чтобы Python вырабатывал последовательность (1,1,2) так, как это было задумано в Matlab. способ чтения.
Элемент в [:,:,0]
в ответе Python для N будет содержать те же значения, что и элемент (:,:,1)
ответ Matlab для M .
Наконец, я не могу найти эквивалент для repmat
, когда кто-то использует продукт Kronecker из
>>> np.kron(np.ones((1,1,2)),M).shape
(1, 2, 6)
, если только я не сделаю предварительное условие M в N , как указано выше. Поэтому я бы сказал, что самый общий способ двигаться дальше - это использовать np.newaxis
.
Игра становится сложнее, когда мы рассматриваем матрицу L ранга 3 (три измерения) и простой случай, когда в выходную матрицу не добавляются новые измерения. Эти две, казалось бы, эквивалентные инструкции не дадут одинаковых результатов
repmat(L,p,q,r) % matlab
np.tile(L,(p,q,r)) # python
потому что строка, столбец, направления вне плоскости (p, q, r) в Matlab и (q, r, p) в Python, который не был виден для массивов ранга 2. Здесь нужно быть осторожным, и для получения одинаковых результатов с двумя языками потребуется больше предварительных условий.
Я знаю, что это рассуждение вполне может быть не общим, но я мог бы разобраться только так далеко. Надеюсь, это побудит других ребят пройти более сложное испытание.