|
|
|
Erhöhung der Geschwindigkeit bei einer numerischen Berechnu |
|
| lila_gepard |

Forum-Anfänger
|
 |
Beiträge: 13
|
 |
|
 |
Anmeldedatum: 29.04.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 29.04.2012, 15:48
Titel: Erhöhung der Geschwindigkeit bei einer numerischen Berechnu
|
 |
| |
 |
|
Hallo,
ich schreibe momentan meine Diplomarbeit und soll dabei einen Monte-Carlo-Ansatz (numerische Berechnung) in Matlab implementieren. Das von mir geschriebene Programm in Matlab R2011b läuft, benötigt jedoch zu viel Rechenzeit. Nun ist meine Frage wie ich diese Geschwindigkeit erhöhen kann.
Das Programm muss zufällig erzeugte Werte für Eingangsgrößen (z.B. x, y, z) in eine Modellgleichung (z.B. a=x+y-z) einsetzen und die jeweiligen Werte für die Ausgangsgröße berechnen. Diese Berechnung muss dabei ca. 1.000.000 mal durchgeführt werden um plausible Ergebnisse zu liefern.
Ich habe mir überlegt zunächst die erzeugten Zufallswerte von double in strings umzuwandeln, anschließend diese mit dem Befehl "strrep" in die Modellgleichung einzusetzen und als letztes die Gleichung durch den Befehl "eval" berechnen zu lassen. Da dies für jede Größe 1*10^6-fach durchgeführt werden muss, dauert die ganze Prozedur leider sehr lange. Deswegen war meine Überlegung diese Abschnitte mithilfe der mex-Funktionen in C zu programmieren. Mein Problem ist dabei die Übergabe von Vektoren bzw. Matrizen in die mex-Funktion sowie deren Berechnung.
Hat evtl. jemand Ahnung von der Programmierung mithilfe von mex-Funktionen oder gibt es noch eine andere Möglichkeit die Geschwindigkeit von großen for-Schleifen zu erhöhen?
Vielen Dank schon mal im voraus!
Liebe Grüße
|
|
|
|
|
|
| Harald |

Forum-Meister
|
 |
Beiträge: 24.502
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 29.04.2012, 16:18
Titel:
|
 |
Hallo,
| Zitat: |
| ich habe mir überlegt zunächst die erzeugten Zufallswerte von double in strings umzuwandeln, anschließend diese mit dem Befehl "strrep" in die Modellgleichung einzusetzen und als letztes die Gleichung durch den Befehl "eval" berechnen zu lassen. |
Warum in aller Welt willst du das tun? Bessere Alternativen:
- a direkt aus x, y, z berechnen, am besten vektorisiert.
- mit Function Handles arbeiten und x, y, z einsetzen.
mex- Funktionen sind natürlich eine Alternative, aber ich würde erst mal versuchen, die Möglichkeiten innerhalb von MATLAB auszunutzen.
Grüße,
Harald
|
|
|
|
| lila_gepard |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 13
|
 |
|
 |
Anmeldedatum: 29.04.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 29.04.2012, 16:43
Titel:
|
 |
Hallo Harald,
erstmal vielen Dank für diese schnelle Antwort. Mit Function Handles habe ich leider noch keine Erfahrung. Ich habe sie eben einmal für eine einfache Funktion ausprobiert und bin überrascht von der Schnelligkeit (2s für drei Variablen und 1*10^6 Wiederholungen)...
Allerdings wird meine Modellgleichung als String eingelesen. Hast du eine Idee wie ich trotzdem die Function Handle benutzen kann? Matlab muss ja die Variablen in der Modellgleichung richtig erkennen um sie lösen zu können.
Viele Grüße!
|
|
|
|
| Harald |

Forum-Meister
|
 |
Beiträge: 24.502
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 29.04.2012, 17:31
Titel:
|
 |
Hallo,
das kannst du mit str2func umwandeln, z.B.
Grüße,
Harald
|
|
|
|
| lila_gepard |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 13
|
 |
|
 |
Anmeldedatum: 29.04.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 29.04.2012, 18:30
Titel:
|
 |
Hallo Harald,
das klingt gut und einfach...ich werde das morgen gleich mal ausprobieren und mich danach melden
|
|
|
|
| lila_gepard |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 13
|
 |
|
 |
Anmeldedatum: 29.04.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 30.04.2012, 09:58
Titel:
|
 |
Hallo Harald,
dein Code läuft sehr gut und schnell...mein einziges Problem ist nun, wie ich die Variablen, die ich in einem Cell-Array als String gespeichert habe, in den Ausdruck
f = str2func(['@(x,y,z)' formel]);
bekomme, so dass diese als Variablen der Funktion formel erkannt werden. Gibt es eine Möglichkeit Buchstaben, die als String gespeichert sind, so umzuwandeln?
Vielen Dank und viele Grüße!
|
|
|
|
| Harald |

Forum-Meister
|
 |
Beiträge: 24.502
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 30.04.2012, 10:23
Titel:
|
 |
Hallo,
du musst die Strings an sich nur mit {} aus dem Cell-Array herausholen.
Wenn es dabei Probleme gibt, bitte konkretes Beispiel.
Grüße,
Harald
|
|
|
|
| lila_gepard |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 13
|
 |
|
 |
Anmeldedatum: 29.04.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 30.04.2012, 10:29
Titel:
|
 |
Hallo,
ich habe mein Problem mal auf dein Beispiel angewendet, es sieht dann folgenermaßen aus:
Variablen{1,1}='x';
Variablen{1,2}='y';
Variablen{1,3}='z';
formel = 'x.*y.*z';
x = rand(1e6,1);
y = rand(1e6,1);
z = rand(1e6,1);
Die Strings sind in dem Cell-Array Variablen gespeichert:
Variablen =
'x' 'y' 'z'
Ich bekomme bei dem Befehl dann folgende Fehlermeldung:
f = str2func(['@(Variablen{1,1},Variablen{1,2},Variablen{1,3})' formel]);
Error using str2func
Error: Unbalanced or unexpected parenthesis or bracket.
Viele Grüße!
|
|
|
|
| Harald |

Forum-Meister
|
 |
Beiträge: 24.502
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 30.04.2012, 11:14
Titel:
|
 |
Hallo,
da hilft es oft, sich vorher den String anzusehen, den man da zusammenbastelt. Vorschlag:
Grüße,
Harald
|
|
|
|
| lila_gepard |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 13
|
 |
|
 |
Anmeldedatum: 29.04.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 30.04.2012, 14:34
Titel:
|
 |
Funktioniert! Super:)
Danke schön!
|
|
|
|
| Stachel |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 30.04.2012, 14:36
Titel:
|
 |
hallo!
ich habe ein ähnliches Problem, da ich auch mit Funktionen arbeite, deren Variablen über eine GUI eingelesen werden sollen. Die Anzahl der Variablen wird dabei vom Benutzer eingegeben, gibt es daher eine Möglichkeit, die Anzahl der Variablen bei beispielsweise dieser Zeile
variabel zu gestalten?
Liebe Grüße
|
|
|
|
| Harald |

Forum-Meister
|
 |
Beiträge: 24.502
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 30.04.2012, 18:33
Titel:
|
 |
Hallo,
sicher. Ich würde den Nutzer bitten, die verwendeten Variablen durch Komma getrennt anzugeben, z.B.
a,b,c,d
und die Formel getrennt eingeben zu lassen.
Dann könntest du das so machen:
Man könnte auch versuchen, aus der Formel die verwendeten Variablen abzulesen. Um das zu automatisieren, müsste man wohl reguläre Ausdrücke bemühen (siehe z.B. regexp).
Grüße,
Harald
|
|
|
|
|
|
|
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.
|
|