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

Dynamische Funktionen auswerten

 

Nakamura
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 19.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.10.2011, 08:57     Titel: Dynamische Funktionen auswerten
  Antworten mit Zitat      
Hallo zusammen,

ich möchte mehrere beliebige, vom Benutzer eingebbare Funktionen mit vielen (>1e4) Werten für die verwendeten Variablen auswerten.

Der unte beigefügte Code funktioniert, allerdings zu langsam. Der Profiler sagt, dass die im Wesentlichen an der langsamen feval-Funktion liegt.

Wie kann man das optimieren? Die m-Schleife ist notwendig, da in der realen Datei mehrere Funktionen ausgewertet werden sollen.

Kann man feval durch etwas schnelleres ersetzen?

Vielen Dank.

Code:
x_values = randn(1e4,3);

func{1} = 'X1-X2/X3^2';

parameter_list{1} = 'X1';
parameter_list{2} = 'X2';
parameter_list{3} = 'X3';

for m=1:1    
    eval('fm = inline(func{m}, parameter_list{:})');

    for k=1:size(x_values,1)
         for c=1:size(x_values,2)
            values_list{k,c} = x_values(k,c);            
         end
         
         y_values(k,m) = feval(fm,values_list{k,:});          
    end    
end
Private Nachricht senden Benutzer-Profile anzeigen


_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 19.10.2011, 09:54     Titel: Re: Dynamische Funktionen auswerten
  Antworten mit Zitat      
Hallo Nakamura,
vielleicht erklärst du uns nochmal genauer, was du genau vor hast. Für mich ist deine Absicht leider nicht ganz erkennbar, da dein Code an ein paar Stellen keinen Sinn macht:

Nakamura hat Folgendes geschrieben:

Code:

for m=1:1  
    eval('fm = inline(func{m}, parameter_list{:})');
...
 



Warum setzt du hier eine Schleife? Und warum der eval Befehl?
Warum nicht einfach folgendes?
Code:

fm = inline(func{1}, parameter_list{:});
 

Nakamura hat Folgendes geschrieben:

Code:

    for k=1:size(x_values,1)
         for c=1:size(x_values,2)
            values_list{k,c} = x_values(k,c);            
         end
 


Was willst du hiermit bewirken? Warum die beiden Schleifen, wenn du nur aus x_values ein Cell-array machst? warum nicht mit x_values einfach wieter arbeiten? Dies könnte man meiner Meinung nach weglassen.

Zum Thema eval gibt es hier sehr viele Beiträge, vorallem von Jan, bei denen er erklärt warum dies zu vermeiden ist.
Nakamura hat Folgendes geschrieben:

Code:

...
         y_values(k,m) = feval(fm,values_list{k,:});          
    end    
end

Bevor man hier was verändert, solltest du erklären was genau du vorhast denke ich...

p.s.: Dein Code brauch bei mir 2,583225s
die folgende Variante nur 2.113680s, aber da geht bestimmt noch mehr:
Code:

x_values = randn(1e4,3);

func = 'X1-X2/X3^2';

parameter_list{1} = 'X1';
parameter_list{2} = 'X2';
parameter_list{3} = 'X3';

fm = inline(func, parameter_list{:});
for k=1:size(x_values,1)          
    y_values(k,1) = fm(x_values(k,1), x_values(k,2), x_values(k,3));            
end
 

_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Nakamura
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 19.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.10.2011, 11:29     Titel:
  Antworten mit Zitat      
Hallo Peter,

Die m-for-Schleife ist notwendig, weil func auch mehr als nur eine Funktion enthalten kann. Ich habe es im Beispiel auf 1 reduziert. Daher ist denke ich auch die eval Funktion nötig.

In deiner Variante hast du nun hardcodiert, dass es drei Variablen gibt. Dies weiß man jedoch nicht, da parameter_list auch mehr als nur drei Variablen enthälten könnte.

Wenn man die Funktion und die Variablen kennen würde, könnte man es effizienter hardcodieren. Die Funktionen und Variablen sind aber variabel, auch bzgl. ihrer Anzahl. Daher der Aufwand.
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: 19.10.2011, 14:32     Titel: Re: Dynamische Funktionen auswerten
  Antworten mit Zitat      
Hallo Nakamura,

Code:
Der unte beigefügte Code funktioniert, allerdings zu langsam. Der Profiler sagt, dass die im Wesentlichen an der langsamen feval-Funktion liegt.

Nein, FEVAL ist definitiv nicht langsam. Das Problem sind die ineffizienten INLINE-Funktionen.

Peter hat ja schon vorgeschlagen, das EVAL einfach wegzulassen:
Code:
eval('fm = inline(func{m}, parameter_list{:})');
% ==>
fm = inline(func{m}, parameter_list{:});

Wozu ist das EVAL denn nötig??

Wenn Du die Funktionen in ein M-file schreiben könntest, wäre das wohl deutlich effizienter als die INLINE-Aufruf. Um wieviele funktionen geht es denn? Sind die Funktionen vektorisierbar?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Naka

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.10.2011, 15:41     Titel:
  Antworten mit Zitat      
Die Funktionen sind nicht vektorisierbar, da sie ja nichtlinear sind.

Typischerweise sind es bis zu 10 Funktionen.

Die Funktionen in m-files zu schreiben habe ich schon versucht. Das bringt nur etwa 50%. Bei typischen 1e6 oder 1e7 vielen Werten wartet man also immer noch ewig.
 
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.