Репликация массива по элементам в Matlab

Скажем, у меня есть одномерный массив:

 a = [1, 2, 3]; 

Есть ли встроенная функция Matlab, которая принимает массив и целое число n и реплицирует каждый элемент массива n раз?

Например, вызов replicate(a, 3) должен возвращать [1,1,1,2,2,2,3,3,3] .

Обратите внимание, что это не то же самое, что и repmat . Я могу, конечно, реализовать replicate , выполняя repmat для каждого элемента и конкатенируя результат, но мне интересно, есть ли встроенная функция, которая более эффективна.

Начиная с R2015a , для этого есть встроенная и документированная функция, repelem :

repelem Репликация элементов массива.
W = repelem(V,N) с вектором V и скалярным N , создает вектор W где каждый элемент из V повторяется N раз.

Второй аргумент также может быть вектором той же длины, что и V чтобы указать количество реплик для каждого элемента. Для 2D-репликации:

 B = repelem(A,N1,N2) 

Больше нет необходимости в kron или других трюках!

ОБНОВЛЕНИЕ. Для сравнения производительности с другими быстрыми методами см. Копии повторов Q & A Repeat элементов массива: декодирование длины в MATLAB .

Я поклонник функции 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 
 a = [1 2 3]; N = 3; b = reshape(repmat(a,N,1), 1, []) 
 >> n=3; >> a(floor((0:size(a,2)*n-1)/n)+1) ans = 1 1 1 2 2 2 3 3 3 

Некоторые экзотические альтернативы. По общему признанию, более забавный, чем полезный:

  1. Назначьте (первый) результат meshgrid вектору:

     b = NaN(1,numel(a)*n); %// pre-shape result b(:) = meshgrid(a,1:n); 
  2. Постройте матрицу, которая умножается на a дает результат:

     b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).'; 
  3. Используйте 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)); 
Interesting Posts

Две OSX-компьютеры в физической близости: параметры?

Создание статической сборки Mac OS XC

Делегирование изменений поведения кеширования в Roslyn

Проблема с ManyToMany Отношения не обновляются сразу после сохранения

Возвращает 2d-массив из функции

Одиночный наблюдаемый с несколькими подписчиками

Как сбросить поисковые системы Chrome по умолчанию?

Как увеличить количество столбцов с помощью R в Linux

Как установить мое приложение для мобильных телефонов в Android Kitkat?

MVVM в WPF – Как предупредить ViewModel об изменениях в Model … или я должен?

pgAdmin III Почему результаты запроса сокращаются?

Почему мой монитор показывает, что поблекшие черные линии движутся повсюду?

функция, которая может использовать iText для объединения / объединения PDF-файлов вместе, что вызывает некоторые проблемы

JPA Query.getResultList () – используется в общем виде

Каков правильный тип индексов массивов в C?

Давайте будем гением компьютера.