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

Skript Laufzeit optimieren - Verkettete For Schleife

 

NiklasMatlab

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.03.2021, 02:23     Titel: Skript Laufzeit optimieren - Verkettete For Schleife
  Antworten mit Zitat      
Hey fleißige Programmierer,

ich müsste ein paar Zeilen code optimeiren, durch die mein Programm teilweise 10 Stunden braucht um durchzulaufen, vielleicht kann mir wer helfen.

Folgende Zeilen bereiten das Problem:

Code:
 d = 1;
  temp = 1;
  A2 = zeros(length(B),length(B));
  for i = 1: length(B)
      for j = 1: d
          A2(i,j) = sum(B(i).b .* B(j).b);
          temp = temp+1;
      end
      d = d+1;
  end



Die Workspace Variablen sind im Anhang unter Datein gespeichert.

Vielleicht kann mir wer helfen:(

Mit freundlichen Grüßen,
Niklas

B.mat
 Beschreibung:

Download
 Dateiname:  B.mat
 Dateigröße:  32.92 MB
 Heruntergeladen:  344 mal


Harald
Forum-Meister

Forum-Meister


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

für den gegebenen Datensatz benötigt mein Rechner 1 Minute.
Warum sind das bei dir 10 Stunden? Hast du einen Datensatz, der deutlich größer ist? Hast du viele solcher Datensätze? Hier wären genauere Informationen hilfreich.

Wenn es darum geht, den vorliegenden Code zu beschleunigen:
Code:
Bmat = vertcat(B.b);
A2_alt = tril(Bmat * Bmat');

Das dauert bei mir nur 2 Sekunden, davon etwa 2/3 für das Verketten. Wenn du die Möglichkeit hast, würde ich b direkt als Matrix statt als Struktur speichern.

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
 
NiklasMaltab

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.03.2021, 20:22     Titel:
  Antworten mit Zitat      
Hallo Harald, der gegebene Datensatz ist nur ein Beispiel und ein kleiner Datensatz.
Habe viele die wesentlich größer sind.

Ok Danke schonmal für die Beschleunigung.

Würde es als Matrix schneller gehen?
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
der gegebene Datensatz ist nur ein Beispiel und ein kleiner Datensatz. Habe viele die wesentlich größer sind.

Das dachte ich mir. Die Frage ist, wie groß der echte Datensatz ist. Passt z.B. ein Datensatz komplett in den Speicher?
Vektorisierter Code benötigt oft mehr Speicher, insofern sind das wichtige Punkte.

Zitat:
Würde es als Matrix schneller gehen?

Ja! Bei meinem Versuch gingen 2/3 der Zeit für die Umwandlung von Struct zu Matrix drauf. Wenn man direkt mit einer Matrix arbeitet, benötigt nochmal um einen Faktor 3 weniger Zeit.

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
 
NiklasMatlab

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.03.2021, 21:45     Titel:
  Antworten mit Zitat      
Ne , manchmal bekomme ich die Fehlermeldung "out of memory".
 
Harald
Forum-Meister

Forum-Meister


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

und nun? Wie meinst du, dass man dir nach diesem Satz nun helfen kann oder soll?

Nochmal: wie groß sind deine Datensätze (maximal)?

Zudem:
* wie groß ist dein Arbeitsspeicher?
* wie sieht dein aktueller Code aus?
* in welcher Zeile genau bekommst du die Fehlermeldung?

In dem Beispieldatensatz waren sehr viele Nullen enthalten. Wenn das bei den anderen Datensätzen auch so ist, können dünnbesetzte Matrizen ( sparse ) Speicher sparen und die Berechnungen beschleunigen.

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
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 20.03.2021, 18:20     Titel:
  Antworten mit Zitat      
Je nach Umfang der Daten bzw des Codes kann auch die Verteilung auf mehrere Prozessorkerne sinnvoll sind. Hierzu solltest du unter parallel Computing bzw der entsprechenden Toolbox näheres finden.

Aber grundsätzlich müsste man erstmal wissen, was "viele Daten" sind und wie viel Arbeitsspeicher vorhanden ist. (Und welche Programme zusätzlich im Hintergrund noch Arbeitsspeicher fressen.)
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
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: 22.03.2021, 15:35     Titel: Re: Skript Laufzeit optimieren - Verkettete For Schleife
  Antworten mit Zitat      
Hallo NiklasMatlab,

Die Grundregel für Schleifen lautet:
Vermeide alle wiederholte Arbeit im Inneren der Schleife.

Damit:
Code:
A2 = zeros(length(B),length(B));
  for i = 1: length(B)
      bi = B(i).b.';
      for j = 1:i
          A2(i, j) = B(j).b * bi;   %
      end
  end

Hier wird das DOT-Produkt verwendet, statt SUM und die elementweise Multiplikation.

Als Matrix wäre das natürlich schneller. Das Problem ist dabei wohl die Größe des RAMs, aber da heißt die Lösung: Mehr RAM installieren.

Gruß Jan
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.