Wie entferne ich eine Reihe von Werten aus einer Matrix/einem Vektor?Hallo. Ich habe einen großen Vektor (dh eine 1-D-Matrix) von Werten, aus dem ich eine Teilmenge der Werte entfernen möchte, wobei die Teilmenge eine nicht sequentielle Menge von Werten aus dem ursprünglichen Vektor enthält. Zum Beispiel:
großer Vektor = [1,2,3,4,5]
Teilmenge = [2,5]
gewünschtes Ergebnis = [1,3,4]
Ich frage mich, ob es einen einfachen Befehl oder eine Reihe von Befehlen gibt, die dies in JSL tun könnten? Ich könnte dies mit einer For-Schleife tun, frage mich aber, ob es eine elegantere oder schnellere Methode gibt?
Betreff: Wie entferne ich eine Reihe von Werten aus einer Matrix/einem Vektor?Danke Jeff! 1000x ist ziemlich gut. Ich wusste eigentlich nicht, dass man einer Zeile eine leere Matrix zuweisen kann, um sie zu löschen.
Ich habe dem technischen Support bereits vorgeschlagen, dass das Dokument geändert oder die langsame Methode beschleunigt werden muss.
Betreff: Wie entferne ich eine Reihe von Werten aus einer Matrix/einem Vektor?DataM = J( 1067000, 8, Random Normal() ) || J( 1067000, 1, Random Binomial( 1, 0.07 ) );
DataM1 = DataM;
DataM2 = DataM;
Close( dt, nosave );
start = Tick Seconds();
foo = As Table( DataM, <<INVISIBLE></INVISIBLE>
Ergebnisse:
data_table_method = 1.0333333333333;
matrix_method1 = 49.166666666667;
matrix_method2 = 0.066666666666606;
@Craige_Hales ' Methode (matrix_method2) ist die schnellste.
Ich war neugierig, ob die Verwendung einer Datentabelle schnell wäre, und obwohl sie 15-mal langsamer als „matrix_method2“ ist, ist sie für dieses bescheidene Problem immer noch ziemlich schnell. Ich war dann neugierig, wie lange es dauern würde, wenn sich Ihre Daten bereits in einer Datentabelle befinden (wobei die Konvertierung in/aus der Datentabelle entfällt) und es sogar noch schneller geht.
foo = As Table( DataM, <<INVISIBLE></INVISIBLE>
Ergebnisse:
data_table_method2 = 0.316666666666606
Betreff: Wie entferne ich eine Reihe von Werten aus einer Matrix/einem Vektor?Ja. Holen Sie sich dann die entgegengesetzte Position mit !=
DataM = DataM[rr,0];
Sollte 100x schneller sein.
Ich vermute, dass die Art und Weise, wie Sie es tun, das Array für jede gelöschte Zeile neu erstellt.Betreff: Wie entferne ich eine Reihe von Werten aus einer Matrix/einem Vektor?@Craige_Hales ,
Haben Sie irgendwelche Gedanken zum effizienten Entfernen von Zeilen aus einer großen Matrix?
Ich habe eine Situation, in der ich eine Datenmatrix habe, die > 1 Million Zeilen x 9 Spalten ist (1.604.736 x 9 im Beispiel vor mir gerade).
Ich muss einige Zeilen entfernen, tatsächlich > 78.000 Zeilen. Hier ist, was ich gerade mache
rr = Loc(DataM[0,4] == 1);
DataM[rr,0] = [];
Ich suche also nach Fällen, in denen die 4. Spalte = 1 ist und ich möchte, dass alle diese Zeilen weg sind.
Die Loc()-Zeile ist superschnell (< 0,05 Sek.), aber die folgende Zeile ist superlangsam (83 Sekunden)!
Ich verwende die JMP-Dokumentation, in der ich Folgendes lese:
Das Löschen von Zeilen und Spalten erfolgt durch Zuweisen einer leeren Matrix zu dieser Zeile oder Spalte.
A[k, 0] = []; // löscht die k-te Zeile
A[0, k] = []; // löscht die k-te Spalte
Vielleicht stecke ich einfach fest, weil meine Datenmatrix groß ist
Mir ist nicht klar, ob ich den Assoziative-Array-Trick anwenden könnte, da ich es mit einer Matrix und nicht mit einem Vektor zu tun habe
Tom
Betreff: Wie entferne ich eine Reihe von Werten aus einer Matrix/einem Vektor?Danke Craige.
Ihre erste Annahme war richtig: Ich möchte die Literalwerte 2 und 5 aus dem Vektor entfernen, der 1,2,3,4,5 enthält. Ein weiteres Beispiel zur Verdeutlichung: Ich möchte diesen Teilmengenvektor aus largevect entfernen:
largevect = [12, 189, 3, 78, -2]
Teilmenge = [189, -2]
gewünschtes Ergebnis = [12, 3, 78]
Ich habe nicht oft AAs verwendet, aber diese Lösung gefällt mir. Danke für die Hilfe!
Betreff: Wie entferne ich eine Reihe von Werten aus einer Matrix/einem Vektor?Ich brauche wahrscheinlich weitere Informationen, um diese Frage gut beantworten zu können.
Wenn Sie Mengenoperationen ausführen, lesen Sie JSL-Set-Operationen Eine Möglichkeit, dies mit assoziativen Arrays zu tun:
// this would be a little more natural using lists
// or associative arrays, but it is easy to make an
// associative array set from a matrix:
largevect = [20, 30, 40, 50, 10];
subset = [20, 50];
aaBigSet = Associative Array( largevect );
aaSmallSet = Associative Array( subset );
// remove the small set from the big set
aaBigSet << Remove( aaSmallSet );
// getkeys returns a list, make a matrix
result = Matrix( aaBigSet << getkeys );
// the original order is lost, but the set is correct
show(result); // [10, 30, 40];
In Ihrem Beispiel ist unklar, ob Teilmenge ist eine Liste von Werten oder die Indizes für Werte. Wenn es sich um die Indizes handelt und Sie die zu behaltenden Indizes anstelle der zu entfernenden Indizes generieren könnten, ist das ganz einfach
largevect = [20, 30, 40, 50, 10];
keepers = [1,3,4];
desired result = largevect[ keepers ];
show(desiredResult); // [20, 40, 50];