Julia: Sortiere die Spalten einer Matrix nach den Werten in einem anderen Vektor (an Ort und Stelle ...)?

8

Ich bin daran interessiert, die Spalten einer Matrix in Bezug auf die Werte in zwei anderen Vektoren zu sortieren. Als Beispiel nehmen wir an, dass die Matrix und Vektoren wie folgt aussehen:

%Vor%

Ich möchte die Spalten von A in Bezug auf ihre entsprechenden Werte in v1 und v2 sortieren, wobei v1 Vorrang vor v2 hat. Außerdem bin ich daran interessiert, die Matrix an Ort und Stelle zu sortieren , da die Matrizen, mit denen ich arbeite, sehr groß sind. Derzeit sieht meine rohe Lösung so aus:

%Vor%

was zum gewünschten Ergebnis führt:

%Vor%

Offensichtlich ist mein Ansatz nicht ideal, da er das Berechnen und Speichern von Zwischenmatrizen erfordert. Gibt es einen effizienteren / eleganteren Ansatz zum Sortieren der Spalten einer Matrix in Bezug auf zwei andere Vektoren? Und kann es an Ort und Stelle getan werden, um Speicher zu sparen?

Vorher habe ich sortperm verwendet, um ein Array nach den Werten zu sortieren, die in einem anderen Vektor gespeichert sind. Ist es möglich, sortperm mit 2 Vektoren (und in-place) zu verwenden?

    
Landon 31.08.2016, 07:43
quelle

1 Antwort

8

Ich würde es wahrscheinlich so machen:

%Vor%

Dies sollte ziemlich schnell sein und verwendet nur einen temporären Vektor und eine Kopie der Matrix. Es ist nicht vollständig an Ort und Stelle, aber es ist nicht leicht, diese Operation vollständig durchzuführen. Sie benötigen eine Sortierfunktion, mit der Spalten verschoben werden, oder eine Version von permute! , die für Spalten verwendet wird. Sie könnten mit dem Code für permute!! in kombinatorics.jl beginnen und ihn ändern, um Spalten zu vervielfältigen, indem Sie einen einzelnen temporären Puffer in Spaltengröße wiederverwenden.

    
Jeff Bezanson 31.08.2016, 14:01
quelle

Tags und Links