|
klaus1 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 24.05.2012, 15:28
Titel: Schleifen vermeiden
|
 |
Hallo,
ich habe mich jetzt eine Stunden durch Beiträge durchgelesen, jedoch nix gefunden was mir bei meinem Problem weiterhilft.
Ich habe eine Matrix A(26,100k) und möchte nun jede Zeile mit jeder vergleichen und die euklidische Distanz von jedem Zeilenpärchen berechnen.
Da ich mich mit Matlab speziell nicht gut auskenne, habe ich es mit einer Doppelschleife probiert. Dies funktioniert zwar, ist jedoch unendlich langsam....
vielleich hat ja jemand eine Idee wie ich mein Problem effizienter lösen kann. Das währe toll.
Vielen Dank im vorraus schonmal
klaus
|
|
|
|
|
Vito |

Forum-Guru
|
 |
Beiträge: 315
|
 |
|
 |
Anmeldedatum: 02.11.09
|
 |
|
 |
Wohnort: Stuttgart
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 24.05.2012, 15:57
Titel:
|
 |
Hi,
kannst du bitte dein Code mal reinstellen vielleicht kann man da was machen .
Bitte stell deine Matrix als *.mat auch rein.
Gruß,
Vito
|
|
|
klaus1 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 24.05.2012, 16:13
Titel:
|
 |
ok hier mal mein Code:
Ich weiß nicht genau ob ich meine Matrix als .mat Datei hier hochladen kann, da ich nicht weiß wie die rechtliche Lage hierbei ist ( ist ein nicht veröffentlichter Datensatz aus einer Forschungsarbeit den ich halt auswerten soll)
Aber im Prinzip eine 26x100000 Matrix mit Werten zwischen - 30 bis 30 und NaN Werten.
hoffe das reicht dir
Gruß
|
|
|
Vito |

Forum-Guru
|
 |
Beiträge: 315
|
 |
|
 |
Anmeldedatum: 02.11.09
|
 |
|
 |
Wohnort: Stuttgart
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 24.05.2012, 17:13
Titel:
|
 |
Hi,
probier folgendes:
Das geht recht schnell ich habe es selbst mit einer 1000x1000 Matrix versucht.
Gruß,
Vito
|
|
|
klaus1 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 25.05.2012, 11:33
Titel:
|
 |
Hallo,
in der Tat, geht schneller . Allerdings habe ich einige NaN Werte in meiner Matrix mit der die norm Funktion wohl nicht umgehen kann :/
Mein M(j,k) besteht dann nur aus NaN Werten.
Ich müsste also vorher in der Schleife von jedem Paar matrix(k, und matrix(j, die NaN Werte eliminieren.
Wenn ich das allerdings so versuche:
bekomme ich immer den Fehler:
??? Subscripted assignment dimension mismatch.
Error in ==> test at 10
matrix(k,any(isnan(matrix))) = [];
Ich weiß leider nicht genau woran das liegt
Vorher eliminieren scheidet leider aus, da ich dann zu wenig Werte insgesammt hätte.
Gruß
|
|
|
Vito |

Forum-Guru
|
 |
Beiträge: 315
|
 |
|
 |
Anmeldedatum: 02.11.09
|
 |
|
 |
Wohnort: Stuttgart
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 25.05.2012, 12:10
Titel:
|
 |
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 27.05.2012, 18:46
Titel:
|
 |
|
 |
|
Hallo klaus1,
Bitte beschreibe die Dimension des Inputs und Outputs nochmal. Zunächst sagtest Du es ging um die Norm zwischen den Zeilen eine [26 x 1e5] Matrix. Dann wäre die Ausgabe [26 x 26].
Mit dem for "j = 1:100000, for k = 1:100000" Ansatz erzeugst Du allerdings eine [1e5 x 1e5] Matrix. Das ist aber eine ganz andere Geschichte.
In beiden Fällen ist eine Pre-allozierung wichtig: Erzeuge zunächst die Ausgabe-Matrix mit ZEROS(), Inf() oder NaN(), so dass der gesamte Speicherbereich alloziert wird, statt ihn stückchenweise zu vergrößern. Bei einer [26 x 26] Matrix ist das nicht dramatisch, bei einer [1e5 x 1e5] Matrix aber deutlich.
Dann ist die erzeugte Matrix symmetrisch, wenn man also ein Element oberhalb der Diagonalen erzeugt hat, kennt man auch den Wert des entsprechenden Elements unterhalb der Diagonalen. Das spart nochmal die halbe Rechenzeit.
PDIST ist langsamer als NORM, die Vektor-Multiplikation v*v' ist aber noch deutlich schneller:
Als nächster Schritt kann man beachten, dass in Matlab die Matrizen spaltenweise gespeichert werden. Der Zugriff auf A(:,i) ist viel effizienter als auf A(i,:), da benachbarte Elemente auch zusammen im Prozessor-Cache zu finden sind. Also:
Während der Orginal-Code (pdist) auf meinem 2009a/64/Win7 Rechner 7.7 Sekunden benötigt, braucht der SQRT(v*v') Code mit Ausnutzung der Symmetrie 1.0 Sekunden und mit der Transposition Q=A'; SQRT(v'*v) noch 0.7 Sekunden.
Ich rate, dass ein C-Mex weitere 10 mal schneller wäre.
Gruß, Jan
|
|
|
klaus1 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 30.05.2012, 15:54
Titel:
|
 |
Hey,
danke jan!!
jetzt braucht mein komplettes Programm anstatt 13min nurnoch 50sec.
Die weiteren Teile meines Programmes kann man bestimmt auch noch ziemlich optimieren, aber das ist schon ok so. Ansonsten hätt ich irgerntwie ein schlechtes Gewissen, wenn ich hier mein koplettes Script ausfragen würde
ich habe mich wohl etwas schlecht ausgedrückt. Tatsächlich soll eine 26x26 Matrix rauskommen, wie in deinem Vorschlag.
Also nochmal vielen Dank an euch beide
Gruß
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
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.
|
|