Вот один из способов, которым мне нравится это делать:
>> 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
для создания вектора гетерогенно реплицированных значений.
Чтобы добавить к списку возможных решений, рассмотрим следующее:
vv = cellfun(@(a,b)repmat(a,1,b), num2cell(v), num2cell(rep), 'UniformOutput',0);
vv = [vv{:}];
Это намного медленнее, чем решение gnovice . .