Элементная репликация массива в Matlab
предположим, у меня есть одномерный массив:
есть ли встроенная функция Matlab, которая принимает массив и целое число n
и повторяет каждый
элемент массива n раз?
replicate(a, 3)
должен возвратить [1,1,1,2,2,2,3,3,3]
.
обратите внимание, что это совсем не то же самое, что repmat
. Я, конечно, могу реализовать replicate
делать repmat
на каждом элементе и конкатенации результата, но мне интересно, есть ли встроенная функция это более эффективно.
7 ответов
по состоянию на R2015a, есть встроенные и документированная функция для этого repelem
:
repelem
реплицировать элементы массива.
W = repelem(V,N)
, С векторомV
и скалярногоN
, создает векторW
, где каждый элементV
повторяетсяN
раза.
второй аргумент также может быть вектором той же длины, как V
чтобы указать количество реплик для каждый элемент. Для 2D репликации:
B = repelem(A,N1,N2)
не нужно kron
или другие трюки больше!
обновление: для сравнения производительности с другими быстрыми методами см. Q & A повторите копии элементов массива: декодирование длины выполнения в MATLAB.
Я фанат крон функция:
>> a = 1:3;
>> N = 3;
>> b = kron(a,ones(1,N))
b =
1 1 1 2 2 2 3 3 3
вы также можете посмотреть этот вопрос (который касался репликации элементов 2-D матриц), чтобы увидеть некоторые другие решения, связанные с индексированием матриц. Вот одно из таких решений (вдохновленное ответ Эдрика):
>> b = a(ceil((1:N*numel(a))/N))
b =
1 1 1 2 2 2 3 3 3
некоторые экзотические варианты. По общему признанию, больше смешно, чем полезно:
-
назначить (первый) результат
meshgrid
вектору:b = NaN(1,numel(a)*n); %// pre-shape result b(:) = meshgrid(a,1:n);
-
построить матрицу, которая умножается на
a
дает результат:b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).';
-
использовать
ind2sub
для создания индексов:[~, ind] = ind2sub([n 1],1:numel(a)*n); b = a(ind);
Если у вас есть панель инструментов обработки изображений, есть еще одна альтернатива:
N = 3;
imresize(a, [1 N*numel(a)],'nearest')
% To get b = [1 1 1 2 2 2 3 3 3]
N = 3;
a = [1 2 3];
temp_a = a(ones(N,1),:);
b = reshape(temp_a,1,numel(temp_a));
% To get b = [1 2 3 1 2 3 1 2 3]
N = 3;
a = [1 2 3];
temp_a = a(ones(N,1),:);
b = reshape(temp_a',1,numel(temp_a));