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.
Verschoben: 03.07.2013, 10:56 Uhr von denny Von Objektorientierte Programmierung nach Programmierung
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?
Verfasst am: 03.07.2013, 14:23
Titel: Re: Vektorcode für Doppelsumme über eine Funktion
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:
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
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.
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...
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
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.