WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Performance optimierung durch Gesamtabfrage

 

Lokdog
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 96
Anmeldedatum: 07.04.16
Wohnort: Heilbronn
Version: ---
     Beitrag Verfasst am: 07.11.2018, 11:35     Titel: Performance optimierung durch Gesamtabfrage
  Antworten mit Zitat      
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.

Dies mache ich mit folgender Schleife:

Code:
while x-z > 2
        if ((strcmp(PUS(1,1),PUS(x-z,1)) == 1) && (strcmp(PUS(1,2),PUS(x-z,2)) == 1))
           
            PUS_NEU(cell2mat(PUS(x-z,3)),1) = PUS(x-z,3);
            PUS(x-z,:) = [];
           
        end
z_z+1;
end


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?

Vielen Dank und viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 07.11.2018, 14:49     Titel: Re: Performance optimierung durch Gesamtabfrage
  Antworten mit Zitat      
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Lokdog
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 96
Anmeldedatum: 07.04.16
Wohnort: Heilbronn
Version: ---
     Beitrag Verfasst am: 07.11.2018, 15:10     Titel:
  Antworten mit Zitat      
Hallo Jan,

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.11.2018, 23:54     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Lokdog
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 96
Anmeldedatum: 07.04.16
Wohnort: Heilbronn
Version: ---
     Beitrag Verfasst am: 08.11.2018, 08:52     Titel:
  Antworten mit Zitat      
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 Smile

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.11.2018, 10:18     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Lokdog
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 96
Anmeldedatum: 07.04.16
Wohnort: Heilbronn
Version: ---
     Beitrag Verfasst am: 08.11.2018, 10:44     Titel:
  Antworten mit Zitat      
Das funktioniert leider nicht, da ich ja nicht einfach 2 Spalten sortieren kann, da dann die Zeilen Zuordnung nicht mehr passt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.11.2018, 11:21     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.