2016-04-12 1 views
0

В MATLAB, если N = 2 это линия мне нужно:Повторяющиеся элементы одного вектора в соответствии со вторым

M = [V(1)*ones(1,L(1)) V(2)*ones(1,L(2))]; 

Если N = 3, линия:

M = [V(1)*ones(1,L(1)) V(2)*ones(1,L(2)) V(3)*ones(1,L(3))]; 

Как я мог бы написать линии, производя те же результаты для произвольного N?

+1

Что вы хотите, декодирование по длине прогона. Вот несколько подходов: http://stackoverflow.com/questions/28501418/run-length-decoding-in-matlab –

ответ

2

Вы можете использовать thi s:

M = cell2mat(arrayfun(@(v,len) v*ones(1,len), V, L, 'uni', 0)); 

пример:

>> V=3:5 
V = 
    3  4  5 
>> L=1:3 
L = 
    1  2  3 
>> M=cell2mat(arrayfun(@(v,len) v*ones(1,len), V, L, 'uni', 0)) 
M = 
    3  4  4  5  5  5 
+3

'v + zeros (1, len)' будет быстрее, чем 'v * ones (1, len)' http://undocumentedmatlab.com/blog/allocation-performance-take-2 – Suever

4

С R2015a вы можете просто использовать встроенный в repelem функции:

M = repelem(V,L) 

или если numel(V) не равна N

M = repelem(V(1:N),L(1:N)) 

Если у вас старая версия MATLAB, рассмотрим простой петля

M = zeros(1, sum(L(1:N))); %// preallocation 
from = 1; 
for elem = 1:N 
    to = from + L(elem) - 1; 
    M(from:to) = v(elem)*ones(1,L(elem)); 
    from = to + 1; 
end 
+0

Спасибо, но я использую более старую версию MATLAB, а именно 2012b. – baister

 Смежные вопросы

  • Нет связанных вопросов^_^