Если вы не настаиваете на использовании repmat
, то вы можете использовать ones
и bsxfun
:
N = 10;
v = [1/4 1/2 1/4];
A = ones(N,N,3);
A = bsxfun(@times,A,permute(v,[3 1 2]))
Это создаст N x N x 3
массив, каждый элемент которого является 1
. Затем мы умножаем каждую подматрицу (от 1
до 3
в последнем индексе) с соответствующим значением от v
, это достигается с помощью bsxfun
. Для этого мы должны ввести основные размеры синглтона в v
(превращение его в [1 x 1 x 3]
), вот для чего нужен звонок для permute
.
Update: Как @Divakar отмечено в комментарии, вы можете опустить последний аспект, когда первый определяющий A
:
N = 10;
v = [1/4 1/2 1/4];
A = ones(N,N); %one less dimension
A = bsxfun(@times,A,permute(v,[3 1 2]))
Причина этого заключается в том, что в MATLAB, предполагается, что каждая переменная имеет бесконечное номер trailing Размеры одноэлементного (вот почему reshape(rand(2),[2 2 1 1 1])
возвращает массив [2 x 2]
вместо [2 x 2 x 1 x 1 x 1]
один: размеры задней синглтонности неявно присутствуют и поэтому опущены). В этом случае вы умножаете матрицу [N x N]
с номером [1 x 1 x 3]
, но первая неявно интерпретируется как [N x N x 1]
. bsxfun
заботится обо всем остальном.
Это может быть быстрее, чем первая 'перестановка' (или' reshape'), а затем 'repmat', потому что таким образом перестановка/переформатирование выполняется с меньшим количеством элементов:' A = [1/4 1/2 1/4 ] '. B = repmat (изменить (A, 1,1, []), 10,10); ' –
Или' A = cat (3, 1/3, 1/2, 1/4); B = repmat (A, 10,10); 'для дальнейшего упрощения кода. – Daniel