Репликация массива по элементам в Matlab
Скажем, у меня есть одномерный массив:
a = [1, 2, 3];
Есть ли встроенная функция Matlab, которая принимает массив и целое число n
и реплицирует каждый
элемент массива n раз?
Например, вызов replicate(a, 3)
должен возвращать [1,1,1,2,2,2,3,3,3]
.
Обратите внимание, что это не то же самое, что и repmat
. Я могу, конечно, реализовать replicate
, выполнив repmat
для каждого элемента и конкатенируя результат, но мне интересно, есть ли более эффективная встроенная функция.
Ответы
Ответ 1
Начиная с R2015a для этого используется встроенная и документированная функция, repelem
repelem
Репликация элементов массива.
W = repelem(V,N)
, с вектором V
и скалярным N
, создает вектор W
, где каждый элемент V
повторяется N
раз.
Второй аргумент также может быть вектором той же длины, что и V
, чтобы указать количество повторений для каждого элемента. Для 2D-репликации:
B = repelem(A,N1,N2)
Нет необходимости в kron
или других трюках больше!
UPDATE:. Для сравнения производительности с другими быстрыми методами см. Q & A Повторить копии элементов массива: декодирование длительности в MATLAB.
Ответ 2
Я поклонник KRON:
>> 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
Ответ 3
a = [1 2 3];
N = 3;
b = reshape(repmat(a,N,1), 1, [])
Ответ 4
>> n=3;
>> a(floor((0:size(a,2)*n-1)/n)+1)
ans =
1 1 1 2 2 2 3 3 3
Ответ 5
Некоторые экзотические альтернативы. Пожалуй, более забавно, чем полезно:
-
Назначьте (первый) результат 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);
Ответ 6
Если у вас есть панель инструментов обработки изображений, есть еще одна альтернатива:
N = 3;
imresize(a, [1 N*numel(a)],'nearest')
Ответ 7
% 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));