Поэлементная репликация массива согласно количеству [дубликат]

8
задан Community 23 May 2017 в 12:33
поделиться

2 ответа

Вот один из способов, которым мне нравится это делать:

>> index = zeros(1,sum(rep));
>> index(cumsum([1 rep(1:end-1)])) = 1;

index =

     1     0     1     0     0     1     1     0     0     0     0

>> index = cumsum(index)

index =

     1     1     2     2     2     3     4     4     4     4     4

>> vv = v(index)

vv =

     3     3     1     1     1     9     4     4     4     4     4

Это работает, сначала создавая индексный вектор нулей той же длины, что и окончательный подсчет всех значений. Выполнив кумулятивную сумму вектора rep с удаленным последним элементом и 1, помещенным в начало, я получаю вектор индексов в index, показывающий, где будут начинаться группы реплицированных значений. Эти точки отмечены единицами. Когда кумулятивная сумма выполняется по индексу , Я получаю конечный вектор индекса, который я могу использовать для индексации в v для создания вектора гетерогенно реплицированных значений.

16
ответ дан 5 December 2019 в 09:25
поделиться

Чтобы добавить к списку возможных решений, рассмотрим следующее:

vv = cellfun(@(a,b)repmat(a,1,b), num2cell(v), num2cell(rep), 'UniformOutput',0);
vv = [vv{:}];

Это намного медленнее, чем решение gnovice . .

2
ответ дан 5 December 2019 в 09:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: