Elementweise Array-Replikation nach einer Anzahl [Duplikat]

8

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

    
merv 04.03.2010, 20:00
quelle

4 Antworten

15

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.

    
gnovice 04.03.2010, 20:10
quelle
2

Um zu der Liste der möglichen Lösungen hinzuzufügen, beachten Sie diese:

%Vor%

Dies ist viel langsamer als das von Gnovice ..

    
Amro 04.03.2010 20:46
quelle
0

Was Sie versuchen, ist run-length decode . Ein zuverlässiges / vektorisiertes Dienstprogramm auf hohem Niveau ist die FEX-Einreichung rude() :

%Vor%

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.

    
Oleg 21.08.2013 13:23
quelle
0

accumarray function kann verwendet werden, damit der Code funktioniert, wenn Nullen in rep array

enden %Vor%

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%     
user502144 17.10.2014 12:01
quelle