zunächst vorab: Ich bin neu hier und habe bislang auch wenig Erfahrung mit Matlab. Sollte ich etwas unklar darstellen, gebt mir Bescheid - ich werde versuchen es zu ändern.
Zum Problem: Ich möchte eine Matrix effizient implementieren. Für jeden Eintrag der Matrix muss ich ein Doppelintegral von einer Funktion lösen, der immer wieder neue Parameter übergeben werden. Zur besseren Verständlichkeit habe ich hier ein einfaches Beispiel:
Code:
n=3;
C=[(1:n)'(2+(1:n))']; % zwei zweispaltige Testvektoren der Länge n
D=C+2;
M = size(D,1); N = size(C,1);
MAT = zeros(M,N);
Mein Problem ist nun, dass ich diese Matrix sehr schnell ziemlich groß werden lassen möchte (5000x5000 wäre ein Traum). Allerdings brauche ich schon für eine 500x500-Matrix etwa 25 Minuten.
Ich habe mich schon ein wenig umgeschaut und zum einen gelesen, dass for-Schleifen gar nicht gut sind. Eine Versuch irgendwie mit cells statt mit Matrizen zu arbeiten, um auf die for-schleifen verzichten zu können, ist aber schon fehlgeschlagen. (Grobe Idee: Die Funktionen in cells speichern und dann @dblquad auf die cells anwenden.) Hat jemand da vielleicht einen bessern Tipp?
Zum anderen ist die Integrationsmethode 'dblquad' für meine Zwecke sicher auch nicht die Beste. Ich habe schon eine (für mein Problem gut geeignete) Gauß-Quadratur versucht, die zum Beispiel für die Beispielfunktion in der letzten Zeile des Codes wahre Wunder wirkt. Leider versagt die Quadraturmethode, wenn ich meine Wunsch-Funktion in FUN einsetze. Meine Wunsch-Funktion sieht zwar ähnlich aus (von der Struktur her) - ist aber viel länger. Hat hier vielleicht jemand eine Idee, wie man die Doppel-Integration geschickt beschleunigen könnte - ohne dass man in andere Probleme läuft? Gibt es vielleicht noch andere Matlab-Befehle?
Vielleicht hat der eine oder andere von ja ein zündende Idee!
In jedem Fall vielen Dank und liebe Grüße von,
hato
ich würde die Frage mal von einer anderen Seite aus angehen:
wozu muss man das Integral für 5000 x 5000 Parameter auswerten? Das Problem ist da vermutlich weniger die for-Schleifen als dass 25 Millionen Integrale ausgewertet werden müssten.
Mein Alternativvorschlag: Versuchen, eine Stammfunktion zu finden (evtl. mit Hilfe der Symbolic Math Toolbox, das sieht ja noch machbar aus) und das Integral analytisch zu lösen. Dann die gewünschten Werte einsetzen.
Grüße,
Harald
hato
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.05.2010, 20:04
Titel:
Hallo Harald,
vielen Dank für deine Antwort. Leider habe ich schon versucht das Integral analytisch zu lösen. Die Funktion oben habe ich nur als Beispiel aufgeschrieben. Meine eigentliche Funktion ist viel länger, als die obige (aber von ähnlicher Struktur) und lässt sich (mit den Standardprogrammen zumindest) nicht analytisch lösen.
Ich versuche es gern noch ein zweites Mal, aber falls ihr eine andere Möglichkeit seht, wäre ich euch dankbar, wenn ihr mir diese mitteilen könntet. Wie gesagt 5000x5000 wäre ein Traum. Ich geb mich ja auch schon mit weniger zufrieden:-)
Liebe Grüße,
hato
PS: Ich hatte irgendwo hier im Forum gelesen, dass for-Schleifen ab einer Größe von ca. 1000 Durchläufen problematisch werden.
ja, vektorisieren wo's geht - in dem Fall sehe ich jedoch keine Möglichkeit.
Und es bleibt die Frage, was du mit dieser 5000x5000 - Matrix willst.
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
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.