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

Entwicklung Anonymous function

 

Anni

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2012, 10:55     Titel: Entwicklung Anonymous function
  Antworten mit Zitat      
Hallo zusammen,
ich habe eine Frage und zwar will ich folgende Funktion implementieren:
f(x,y)=summe_(j=1)^m summe_(i=1)^n u_ji*v_i(x)*p_j(y)
Also ich habe die Koeffizienten u_ji bestimmt und die Funktionen v_i, p_j sind definiert.
Mir ist nur folgendes eingefallen:
Code:

umh=@(x,y)(0);
for j=1:m
    for i=1:n
        umh=@(x,y)(umh(x,y)+u((j-1)*n+i).*v{i}(x).*p{j}(y));
    end
end
 

Dabei ist u mein Vektor mit den Koeffizienten (dabei ist für die ersten n einträge m=1, dann n einträge mit m=2 usw. ), v, p sind cell arrays mit function handles von den einzelnen v_i, p_j.
n und m sind feste Zahlen, also keine Variablen oder so.
Das Problem ist nun, wenn n und m zu groß sind, bekomme ich den Fehler maximum recursion limit erreicht. Ich rufe die Funktion umh anscheinend zu oft auf. Hat jemand eine andere Idee wie ich diese Entwicklung darstellen kann, sodass das Ergebnis wieder ein function handle ist.
Danke für die Hilfe


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2012, 20:11     Titel:
  Antworten mit Zitat      
Hallo Anni,

warum muß es eine anonyme Funktion sein?
Code:
umh=@(x,y)umhh(x,y,u,v,p);

function result=umhh(x,y,u,v,p)
result=0;
for j=1:m
    for i=1:n
        result=result+u((j-1)*n+i).*v{i}(x).*p{j}(y);
    end
end


zum Zweiten werden hier ja v(x) und p(y) für jedes j und i berechnet, obwohl sie ja von
i bzw. j unabhängig sein. Je nachdem, wie komplex die Funktionen sind, kann es enorme
Geschwindigkeitsvorteile bieten, die Werte vor der Schleife vorzuberechnen:
Code:
v_werte=cellfun(@(f)f(x),v);
p_werte=cellfun(@(f)f(y),p);


Warum ist u ein Vektor und keine nxm-Matrix? Zugriff mit u(i,j)?

Schließlich könnte man die for-Schleifen noch durch Matrixoperationen ersetzen:
Code:
umh=@(x,y)sum(sum(u.*repmat(cellfun(@(f)f(x),v),1,m).*repmat(cellfun(@(f)f(y),p)',n,1));


Grüße Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
Anni

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.07.2012, 12:02     Titel: Entwicklung Anonymous function
  Antworten mit Zitat      
Hallo Sirius,
Danke für deine Antwort.
Das mit dem
Zitat:
Code:

umh=@(x,y)umhh(x,y,u,v,p);

function result=umhh(x,y,u,v,p)
result=0;
for j=1:m
    for i=1:n
        result=result+u((j-1)*n+i).*v{i}(x).*p{j}(y);
    end
end
 

hat gut geklappt, also ich kann jetzt auch große Werte für m und n nehmen ohne das ich diese Fehlermeldng mit dem recusion limit bekomme.

Ich weiß nicht genau was du mit dem "vorberechnen" vor der Schlife meinst.
Zitat:
Code:
v_werte=cellfun(@(f)f(x),v);
p_werte=cellfun(@(f)f(y),p);

liefert bei mir auch eine Fehlermeldung. Aber ich weiß auch gar nicht wozu ich das mache?

Das u ist ein Vektor, weil ich den aus dem Lösen eines Gleichunsgsystem bekomme.
Dein letzter Vorschlag mit den Vektoren klappt leider auch nicht bei mir, da bekomme ich den Fehler
Code:
??? Error using ==> cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.

Error in ==>
@(x,y)sum(sum(u.*repmat(cellfun(@(f)f(x),v),1,m)).*repmat(cellfun(@(f)f(y),p)',n,1))


Error in ==> MODVER at 133
Z = umh(X,Y);
 

Vielleicht weißt du was ich da falsch mache?
Ansonsten erstmal vielen Dank für den ersten Vorschlag mit dem Auslagern von einer extra Funktion, damit klappt es ja erstmal.
Viele Grüße,
Anni
 
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.