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

Vektorcode für Doppelsumme über eine Funktion

 

AlexSchmidt
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 03.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2013, 10:52     Titel: Vektorcode für Doppelsumme über eine Funktion
  Antworten mit Zitat      
Hallo Leute,

ich benöitge einen effizienten Code für das Lösen von Doppelsummen über Funktionen. Leider konnte ich auch nach längerem Suchen keine Lösung finden.

Das Grundproblem ist hier einmal in Schleifenform dargestellt. Dabei ist die aufzusummierende Funktion erstmal nur ein Dummy.

Code:

x=linspace(1,5,300);
Y=zeros(300,1);
 
for xt=1:300

   
    % für jeden Wert x(xt) wird die Summe über alle k und l gebildet
 
    Summe=0;
   
    for k=1:300
        for l=1:300

            Summe=Summe+ (x(xt)*sqrt(k*x(xt)).*sqrt(l*x(xt)));
 
        end
    end
   
    Y(xt)=Summe;
   
end

figure(1),plot(x,Y)

 



Die einzige Lösung, die mir bisher in Vektorschreibweise eingefallen ist sieht folgendermaßen aus:

Code:


x=linspace(1,5,300);
k=linspace(1,300,300);
[kt,lt,xt]=meshgrid(k,k,x);

func=(xt.*sqrt(kt.*xt).*sqrt(lt.*xt));
Y=sum(sum( func ));

figure(2),plot(x,Y(:,:));

 


Allerdings ist diese wahnsinnig langsam, da jede Größe kt, lt, xt die Dimension 300x300x300 bekommt. Eigentlich völlig überflüssig, da in jedem Tupel dann die dieselben Werte nur vervielfältigt werden.

Geplant ist jedoch eine deutliche Erhöhung der Vektorgröße (gegen 10000).

Ich würde mich freuen, wenn jemand eine gute Idee hat wie man ein solches Problem effizient in Vektorcode umsetzen kann.
Private Nachricht senden Benutzer-Profile anzeigen
Verschoben: 03.07.2013, 10:56 Uhr von denny
Von Objektorientierte Programmierung nach Programmierung


Harald
Forum-Meister

Forum-Meister


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

hier ginge z.B. das:

Code:
for xt=1:300
   
   
    % für jeden Wert x(xt) wird die Summe über alle k und l gebildet
   
    Summe=0;
    tmp1 = sum(sqrt((1:300)*x(xt)));
    tmp2 = sum(sqrt((1:300)*x(xt)));
   
    Y(xt)=x(xt)*tmp1*tmp2;
   
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
AlexSchmidt
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 03.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2013, 13:25     Titel:
  Antworten mit Zitat      
Eine ähnliche Lösung hatte ich auch schon verfolgt. Leider wollte ich den x-Vektor auch Richtung 10000 gehen lassen. Diese letzte Schleife wäre damit immer noch sehr langsam.

Gibt es da keine Möglichkeit einen Vektor so zu bilden, dass er die x-Werte sozusagen "Elementweise" ausspuckt. Also den sum-Funktionen untergeordnet ist.

Oder vielleicht eine ganz andere Code-Struktur, die dieses Problem über eine alternative herangehensweise löst?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

in dem speziellen Fall kannst du x(xt) noch ausklammern, so dass es sehr viel einfacher wird:

Code:
tmp = sum(sqrt(1:numel(x)));
Y=x.^2*tmp^2;


Ich fürchte aber, dass das bei allgemeineren Funktionen nicht möglich sein wird.

Der vorherige Code braucht übrigens bei mir auch mit 300 statt 10000 gerade mal 4 Sekunden. Unter "sehr langsam" verstehe ich anderes.

Zitat:
dass er die x-Werte sozusagen "Elementweise" ausspuckt. Also den sum-Funktionen untergeordnet ist.

Mir ist nicht klar, was du dir da vorstellst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.07.2013, 14:23     Titel: Re: Vektorcode für Doppelsumme über eine Funktion
  Antworten mit Zitat      
Hallo AlexSchmidt,

Nein, das ist in Matlab nicht möglich. Die Vektorisierung bedeutet, dass man zunächst ein großes temporäres Array erstellen muss, was viel Zeit benötigt. Deswegen kann die Schleifen-Lösung schneller sein. Man kann auf jeden Fall keine "instant-Vektoren" erstellen, die sich erst innerhalb der SUM-Funktion magisch selbst zusammensetzen.
Das geht dagegen wieder in C deutlich einfacher, so dass sich ein C-Mex-Programm lohnen könnte.

Natürlich lohnt sich die grundsätzliche Methode, aller wiederholten Berechnungen aus dem Schleifen herauszuziehen. Für Dein Beispiel wäre das:
Code:
x = linspace(1,5,300);
Y = zeros(300,1);

for xt=1:300
   Summe = 0;    
   xt2 = x(xt) ^ 2;
   for k = 1:300
      S = 0;
      for l = 1:300
            S = S + sqrt(l);
      end
      Summe = Summe + S * xt2 * sqrt(k);
   end
   Y(xt) = Summe;
end

Dann fällt plötzlich auf, dass die innere Summe gar nicht mehr von den äußeren Schleifen abhängt. Dann:
Code:
S = sum(sqrt(1:300));
for xt=1:300
   Y(xt) = S * S * x(xt) ^ 2;
end

Und das lässt sich dann leicht vollständig vektorisieren.

Ich konnte das nicht testen, weil ich kein Matlab zur Verfügung habe, so dass mir die eine oder andere Vereinfachung Fehler haben könnte. Aber das Prinzip ist wohl klar: Das Herausziehen wiederholter Berechnungen vereinfacht solche Summe oft enorm. Ich kenne kein Programm, mit dem man das automatisiert machen könnte.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
AlexSchmidt
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 03.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.07.2013, 13:21     Titel:
  Antworten mit Zitat      
Sorry für die verspätete Reaktion,

mein gewollter Funktionsausdruck ergibt sich aus Kombinationen von Gamma-Funktionen, damit sind die ganzen Vereinfachungsvorschläge indem die Grundfunktion zerlegt wird im Prinzip nicht möglich...

Wahrscheinlich bleibt mir wohl nichts anderes übrig, als mich mit der mex-Programmierung auseinanderzusetzen...

Auf jeden Fall vielen Dank für eure Hilfe!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 09.07.2013, 13:48     Titel:
  Antworten mit Zitat      
Hallo AlexSchmidt

Zitat:
mein gewollter Funktionsausdruck ergibt sich aus Kombinationen von Gamma-Funktionen, damit sind die ganzen Vereinfachungsvorschläge indem die Grundfunktion zerlegt wird im Prinzip nicht möglich...

Bitte poste solche wichtigen Details nicht erst, nachdem wir Zeit in Lösungsvorschläge gepackt haben. Bei der Beschreibung eines Problems zu sehr zu vereinfachen kann Dir und den Antwortenden viel Zeit rauben.

Eventuell wäre es sinnvoll das Problem mit den nicht-ausklammerbaren Gamma-Funktionen zu posten. Oder vielleicht reichen Dir die gezeigten Möglichkeiten auch schon, um es selbst so weit wie möglich beschleunigen zu können.

Ein MEX wäre nicht verkehrt, aber manchmal bekommt man eine Ersparnis von einer Stunde Laufzeit, hat dafür aber 4 Stunden programmiert.

Gruß, Jan
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.