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

Komplizierte Matrix effizient implementieren

 

hato

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2010, 21:14     Titel: Komplizierte Matrix effizient implementieren
  Antworten mit Zitat      
Liebe Forenmitglieder,

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);

  for e=1:M
      for d=1:N
         MAT(e,d) = dblquad(@(s,r)FUN,-1,1,-1,1);
      end
  end

% FUN ist dabei abhängig von s,r,e und d, z.B. FUN=0.5*C(d,2)*sin(s)-D(e,2)*cos(r)+C(d,1)^2*r.^2+5*D(e,1)^2*s
 


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


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.05.2010, 22:40     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
hato

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.05.2010, 20:04     Titel:
  Antworten mit Zitat      
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.
 
Harald
Forum-Meister

Forum-Meister


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

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
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 - 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.