Для умного использования линейной индексации или accumarray
, я иногда чувствовал необходимость генерации последовательностей на основе кодирования длины пробега. Поскольку для этого нет встроенной функции, я прошу наиболее эффективный способ декодирования последовательности, закодированной в RLE.
Технические характеристики:
Чтобы сделать это справедливым сравнением, я хотел бы установить некоторые спецификации для функции:
- Если указан необязательный второй аргумент
values
той же длины, вывод должен соответствовать указанным значениям, иначе значения1:length(runLengths)
. - Изящно обрабатывайте:
- нули в
runLengths
-
values
является массивом ячеек.
- нули в
- Выходной вектор должен иметь тот же формат столбца/строки, что и
runLengths
Короче: функция должна быть эквивалентна следующему коду:
function V = runLengthDecode(runLengths, values)
[~,V] = histc(1:sum(runLengths), cumsum([1,runLengths(:).']));
if nargin>1
V = reshape(values(V), 1, []);
end
V = shiftdim(V, ~isrow(runLengths));
end
Примеры:
Вот несколько тестовых примеров
runLengthDecode([0,1,0,2])
runLengthDecode([0,1,0,4], [1,2,4,5].')
runLengthDecode([0,1,0,2].', [10,20,30,40])
runLengthDecode([0,3,1,0], {'a','b',1,2})
и их вывод:
>> runLengthDecode([0,1,0,2])
ans =
2 4 4
>> runLengthDecode([0,1,0,4], [1,2,4,5].')
ans =
2 5 5 5 5
>> runLengthDecode([0,1,0,2].', [10,20,30,40])
ans =
20
40
40
>> runLengthDecode([0,3,1,0],{'a','b',1,2})
ans =
'b' 'b' 'b' [1]