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.

Spezifikation

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 inrunLengthsvalues 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]

Antworten auf die Frage(8)

Ihre Antwort auf die Frage