Verfasst am: 07.11.2018, 10:35
Titel: Performance optimierung durch Gesamtabfrage
Guten Tag,
momentan nehme ich die erste Zeile einer Matrix, neheme davon Spalte 1 und 2 und überprüfe ob die Kombination aus Spalte 1 und 2 in irgend einer Zeile nochmals vorkommt. Wenn diese vorkommt, nimm die Zeile, merke dir die Zeilennummer und lösche sie aus der aktuellen.
Problem dabei ist, die Matrix besitzt zu beginn 40000 Zeile, und somit dauert das durchgehen seeeehr lange, da ich sobald ich die erste Zeile mit allen Zeilen verglichen habe, die zweite Zeile mit den übrigen vergleichen muss.
Gibt es eine Möglichkeit, dass ich die erste Zeile (Spalte 1 & 2) nehme und einfach nur Abfrage ob diese in der gesamten Matrix nochmals vorkommt? Ohne Zeile für Zeile durchgehen zu müssen?
Verfasst am: 07.11.2018, 13:49
Titel: Re: Performance optimierung durch Gesamtabfrage
Hallo Lokdog,
Der Code ist nicht selbsterklärend. Welchen Typ hat PUS? "strcmp" klingt nach einem CHAR oder einem Cell String, vielleicht ein String-Array? Wozu dient dann "cell2mat(PUS(x-z,3))"? Was ist "x"? Welchen Wert hat "z"?
Das iterative Verkleinern (oder Vergrößern) von Arrays ist enorm ineffizient. Es muss jeweils fast das gesamte Array neu alloziert werden und das alte kopiert.
Zitat:
Gibt es eine Möglichkeit, dass ich die erste Zeile (Spalte 1 & 2) nehme und einfach nur Abfrage ob diese in der gesamten Matrix nochmals vorkommt?
strcmp
kommt auch mit einem Array als Input zurecht. Das sollte deutlich effizienter sein. Ein Beispiel kann man posten, wenn klar ist, was Deine Input-Variablen sind.
vielen Dank für deine Antwort. Folgend die genauen Erklärungen.
- PUS ist vom Typ Cell.
- PUS_NEU(cell2mat(PUS(x-z,3)),1) = PUS(x-z,3);
-> PUS Spalte 3 ist mit Zahlen befüllt. Und mit diesem Aufruf nehme ich die Zahl, an der Stelle wo ich gerade bin und schreibe sie in eine neue Variable, an der Stelle, nur in der ersten Spalte
- x ist die Länge von PUS, die ich vor der while Schleife definiere.
- z ist auch vor der Whileschleife definiert und gleich 0:
Man muss dazu sagen, die Whileschleife steht in einer For Schleife.
Hintergrund: In der For Schleife nehme ich die Erste Zeile und Gleiche es dann von Hinten in der While Schleife mit allen Zeilen von PUS ab.
Wenn erwünscht kann ich auch den ganzen Code posten.
es könnte helfen, das Cell Array zunächst sortieren (sortrows). Dann müssen nur noch aufeinanderfolgende Zeilen verglichen werden.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Du meinst, dass man nach einer Spalte sortiert und somit immer nur die nächsten "n" Zeilen prüfen muss, bis ein neuer Wert drin vorkommt. Würde die performance auf jedenfall erhöhen. Danke für die Idee
wenn du zwei Spalten vergleichen willst, würde ich auch nach diesen beiden Spalten sortieren (sortrows bietet das an). Dann brauchst du sogar nur aufeinanderfolgende Zeilen zu vergleichen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
bei sortrows werden die Zeilen als ganzes behandelt.
Die ursprüngliche Anordnung der Zeilen kannst du dir als optionalen Output zurückgeben lassen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.