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

zeilenweises Addieren einer Matrix dauert zu lange

 

StephanF
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 16.01.09
Wohnort: Hamburg
Version: R2007b, R14
     Beitrag Verfasst am: 20.01.2009, 15:47     Titel: zeilenweises Addieren einer Matrix dauert zu lange
  Antworten mit Zitat      
Hallo
Vorab bitte ich um Verzeihung, wenn ich bestimmte MATLAB- Konventionen im Quellcode, wenn es denn welche gibt, nicht eingehalten habe. Ich bin ein absoluter Newbie im MATLAB programmieren.
Ich habe ein Zeitproblem mit meinem Programm. Ich habe es mal angehängt, da der Quellcode inclusive der Kommentarzeilen doch ziemlich lang ist.

Nun meine Frage zu diesem Thema.
Ich habe (zurzeit erstmal nur simuliert) zwei große Matrizen und jeweils eine dazugehörige Zeitspur. Diese beiden Matrizen möchte ich nun zusammenführen und für jede Uhrzeit nur eine Zeile erhalten, also bei gleichem Spaltenwert der beiden Vektoren sollen die beiden Zeilen der Matrizen zusammengesetzt werden. Ich löse dies über eine for-Schleife. Dies klappt gut, ich erhalte das gewünschte Ergebnis. Nur bei der Menge der Zeilen (in Quellcode habe ich in den simulierten Matrizen einen eher kleineren Wert angenommen, kann durchaus auch doppelt so lang sein) wird die Dauer, die das Programm läuft extrem groß, auf meinem System ca. 1h.
Ich denke, dass es einen anderen Weg als eine for-Schleife gibt, dieses Problem zu lösen und würde mich freuen, wenn jemand behilflich sein kann.

Vielen Dank für die/den Tipp
Stephan

doppelte_saetze.txt
 Beschreibung:
Der Quellcode meiner Variante

Download
 Dateiname:  doppelte_saetze.txt
 Dateigröße:  2.06 KB
 Heruntergeladen:  722 mal
Private Nachricht senden Benutzer-Profile anzeigen


apn
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 04.12.08
Wohnort: Wolfsburg
Version: ---
     Beitrag Verfasst am: 21.01.2009, 10:13     Titel:
  Antworten mit Zitat      
Hi,

zwei Tipps von mir:
füge mal das hier direkt in die Zeile vor der for-Schleife:
Code:
dat_neu_umsort=zeros(m,8);

Außerdem mach das i augeben innerhalb der for-Schleife weg, indem Du es löschst oder ein Semikolon setzt.

mit diesen beiden kleinen Optimierungen juckelt er das auf meinem (Quadcore 2,66 GHz) innerhalb von 4 Sekunden durch. Ohne brech ich ihn nach max. 30 Sekunden ab (zu ungeduldig).

Hintergrund: Da die Variable dat_neu_umsort nicht definiert ist, wird in jedem von den 100.000 Durchläufen neu Speicherplatz reserviert, weil sie sich ja immer vergrößert. Das kostet jedesmal n Haufen Zeit (Wahrscheinich nur Millisekunden, aber bei 100.000...) Wenn Du das vorher machst, dann muss er nur einmal Speicher reservieren und danach nur noch reinschreiben.
Werte Ausgeben kostet sowieso auch immer viel zu viel Rechenzeit.

lg, apn
Private Nachricht senden Benutzer-Profile anzeigen
 
StephanF
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 16.01.09
Wohnort: Hamburg
Version: R2007b, R14
     Beitrag Verfasst am: 21.01.2009, 12:38     Titel:
  Antworten mit Zitat      
moin

ja super, vielen dank. ich hab den programmlauf auf eine minute gekürzt. toller tipp. bei größeren datenmengen, also die doppelte anzahl an zeilen brauch ich jetzt mit nem älteren pc zwar noch ca 5 minuten, ist aber vertretbar und ich kann diese strategie weiterverfolgen.
vielen dank,
stephan!
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 21.01.2009, 15:05     Titel:
  Antworten mit Zitat      
Denke schon das man das auch als Matrix lösen kann, dann sollte das Program in ein paar Sekunden ablaufen.

Probier mal lieber mein Beispiel, bei 20 ungeraden Werten ist die Chance sehr gering das die sich 4 mal wiederholen. Ist jetzt auch nicht optimal aber so ungefähr ist die Idee.

Code:


clear;

dat1=fix(4*rand(52560,4));
dat2=fix(4*rand(52560,4));

comp=dat1==dat2;
comp=all(comp');
%%% dann haste in comp ne 0 wenn die Zeilen übereinstimmen, ansonsten ne 1

%%% verstehe bloß noch nicht ganz was dann hier passieren muss, hab gerade
%%% nicht die Zeit mich da komplett einzuarbeiten. Aber zum Beispiel an den
%%% Stellen den Wert doppelt nehmen:

comp2=comp'.*2;
comp2(1)
comp2=[comp2,comp2,comp2,comp2];
datout=dat1.*comp2;


Sag bitte Bescheid wies läuft.

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
StephanF
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 16.01.09
Wohnort: Hamburg
Version: R2007b, R14
     Beitrag Verfasst am: 22.01.2009, 14:07     Titel:
  Antworten mit Zitat      
hallo oli
ich werde deine version mal bei gelegenheit ausprobieren. aber durch den ersten tipp wurde das programm erheblich schneller. nun hab ich die zweite matrix, die in der schleife jeweils eine zeile dazubekommt auch davor definert. jetzt brauch ich mit nem wald und wiesenrechner für rund 105000 zeilen etwas 2 sec. das ist unschlagbar Wink

also vielen dank für deinen tipp und bis später mal!
Stephan!
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.