Meine Frage ähnelt dieser one , aber ich würde es gerne tun replizieren Sie jedes Element nach einer Anzahl, die in einem zweiten Array derselben Größe angegeben ist.
Ein Beispiel dafür ist, dass ich ein Array v = [3 1 9 4]
hatte, ich möchte rep = [2 3 1 5]
verwenden, um das erste Element zweimal, das zweite dreimal usw. zu replizieren, um [3 3 1 1 1 9 4 4 4 4 4]
zu erhalten.
Bisher verwende ich eine einfache Schleife, um den Job zu erledigen. Das ist, womit ich angefangen habe:
%Vor%Ich habe es geschafft, mich durch Vorabzuweisung von Speicherplatz zu verbessern:
%Vor%Aber ich denke immer noch, dass es einen schlaueren Weg dafür geben muss ... Danke
Hier ist eine Art, wie ich das erreichen möchte:
%Vor% Dies funktioniert, indem zuerst ein Indexvektor von Nullen mit der gleichen Länge wie die endgültige Anzahl aller Werte erstellt wird. Durch Ausführen einer kumulativen Summe des Vektors rep
mit dem letzten entfernten Element und einer am Anfang platzierten 1, erhalte ich einen Vektor von Indizes in index
, der anzeigt, wo die Gruppen von replizierten Werten beginnen. Diese Punkte sind mit Einsen markiert. Wenn eine kumulative Summe für index
ausgeführt wird, erhalte ich einen endgültigen Indexvektor, mit dem ich in v
indexieren kann, um den Vektor der heterogen replizierten Werte zu erstellen.
Was Sie versuchen, ist run-length decode . Ein zuverlässiges / vektorisiertes Dienstprogramm auf hohem Niveau ist die FEX-Einreichung rude()
:
das Ergebnis
%Vor% Beachten Sie, dass diese Funktion auch die umgekehrte Operation ausführt, d. h. Lauflänge codiert einen Vektor oder mit anderen Worten values
und die entsprechende counts
zurückgibt.
accumarray
function kann verwendet werden, damit der Code funktioniert, wenn Nullen in rep
array
Dies funktioniert ähnlich wie bei der Lösung von gnovice, nur dass die Indizes akkumuliert statt 1 zugewiesen werden. Dadurch können einige Indizes (3 und 6 im folgenden Beispiel) übersprungen und entsprechende Elemente aus der Ausgabe entfernt werden.
%Vor%Tags und Links arrays matlab repeating run-length-encoding elementwise-operations