Я хотел бы реализовать следующую функцию:
Введите:
Вектор значений
Вектор того же размера с указанием количества вхождений, которое каждое значение (соответствующего индекса) должно иметь в выходном векторе.
Выход:
Вектор значений, 1by1 в повторяющихся последовательностях, где каждое значение отображается в виде необходимого количества вхождений.
Значения будут продолжать отображаться 1by1, пока значение не появится столько раз, сколько необходимо, тогда остальные значения будут появляться без него.
Пример:
Входы:
[1,2,3,4]
[3,2,5,1]
Выход:
[1 2 3 4 1 2 3 1 3 3 3]
Требуемое решение:
Я хотел бы найти решение, которое является простым, но не использует никаких циклов и является модульным для любой длины входных векторов.
Текущее решение:
Пока что удалось реализовать только с циклами или с неприятным индексированием. Решение с петлями выглядит следующим образом:
Двойной цикл:
vals_vec=1:4;
occur_vec=[3,2,5,1];
output_vec=zeros(1,sum(occur_vec));
num_of_vals=length(vals_vec);
output_i=1;
while (output_i<=length(output_vec)) % While in length of output vector
for cur_val_i=1:num_of_vals % Loop over all values
if(occur_vec(cur_val_i)>0) % If value hasn't reached its occurrence number
occur_vec(cur_val_i)=occur_vec(cur_val_i)-1;
output_vec(output_i)=vals_vec(cur_val_i);
output_i=output_i+1;
end
end
end
output_vec
Один цикл:
vals_vec=1:4;
occur_vec=[3,2,5,1];
output_vec=[];
for cur_num_of_vals=length(vals_vec):-1:1
[min_val,min_i]=min(occur_vec); % Find lowest occurrence number
output_vec=[output_vec,repmat(vals_vec,1,min_val)]; % Add vals accordingly
vals_vec=[vals_vec(1:min_i-1),vals_vec(min_i+1:cur_num_of_vals)]; % Remove the corresponding val
occur_vec=occur_vec-min_val; % Reduce Occurences from all vals
occur_vec=[occur_vec(1:min_i-1),occur_vec(min_i+1:cur_num_of_vals)]; % Remove the corresponding occurrence number
end
output_vec
Спасибо!