Lauflängendekodierung in MATLAB
Für geschickte Verwendung der linearen Indexierung oderaccumarray
, Ich habe manchmal das Bedürfnis verspürt, Sequenzen basierend auf @ zu generier Lauflängencodierung. Da es hierfür keine eingebaute Funktion gibt, frage ich nach dem effizientesten Weg, eine in RLE codierte Sequenz zu decodieren.
Um dies zu einem fairen Vergleich zu machen, möchte ich einige Spezifikationen für die Funktion festlegen:
Wenn optionales zweites Argumentvalues
gleich lang angegeben, die Ausgabe sollte diesen Werten entsprechen, sonst nur die Werte1:length(runLengths)
.Gracefully behandeln:zeros inrunLengths
values
ein Zellenarray sein.Output-Vektor sollte dasselbe Spalten- / Zeilenformat haben wierunLengths
Kurz: Die Funktion sollte dem folgenden Code entsprechen:
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
Beispiele:Hier sind ein paar Testfälle
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})
und ihre Ausgabe:
>> 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]