Funktionsvariablen erweitern < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 18:27 So 17.12.2006 | Autor: | axes |
Hi,
Frage:
Kann ich bei einer Inline-Funtion nachträglich die Paramterliste ändern?
Bsp:
Die Inline Funktion f(x1) soll zusätzlich abhängig von x2 sein -> f(x1,x2)
Wofür?:
Ich habe eine Matrix von Funktionen, welche von den Variablen x1 bis xn abhängig sind. Wobei manche Funktionen zB nur von x1, andere von mehreren Variablen abhänig sind.
Bei einem Schleifendurchlauf zur Berechnung der einzelnen Felder kann ich nun nicht angeben f(x1,x2,x3,...,xn), da MatLab bemeckert, dass bei manchen Funktionen zuviel Input vorhanden ist.
Nun würde ich gerne alle Funktionen auf f(x1,x2,...,xn) abändern.
Oder gibt es einen anderen eleganteren Weg?
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Hallo,
ich weiß nicht genau, was hier "elegant" wäre, aber ich dir mal zwei Vorschläge unterbreiten:
1. Wir machen wirklich alle Funktionen von allen Variablen abhängig oder
2. Wir lassen einfach nur das auswerten, was für unsere Funktion nötig ist.
Zu 1.:
f = inline('sin(x)');
g = inline('cos(y)');
h = inline('tan(x+y)');
%Wir machen alle Funktionen von x und y abhängig:
f2 = inline(formula(f),'x','y')
g2 = inline(formula(g),'x','y')
h2 = inline(formula(h),'x','y')
%Wir können alle Funktionen auf gleiche Weise auswerten:
x = rand(2,1);
ff = f2(x(1),x(2));
gg = g2(x(1),x(2));
hh = h2(x(1),x(2));
Zu 2.:
Wir können einfach den Aufruf anders gestalten, indem wir allen Parametervariablen (hier müssen wir genau auf die Namen achten!) Werte zuweisen und jede Funktion einfach ausgewertet wird:
f = inline('sin(x)');
g = inline('cos(y)');
h = inline('tan(x+y)');
x = rand;
y = rand;
%Auswerten:
ff = eval(formula(f));
gg = eval(formula(g));
hh = eval(formula(h));
Beides nicht wirklich elegant, aber wenn es viele Funktionen sind, dann frisst der Teufel Fliegen...
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:09 So 17.12.2006 | Autor: | axes |
f2 = inline(formula(f),'x','y')
Genau diesen Befehl hab ich gesucht :) Danke für die schnelle Antwort
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:53 Mo 18.12.2006 | Autor: | axes |
f = inline(formula(f),'x','y')
Frage:
Kann ich die Variablen 'x' und 'y' in diesem Fall auch als Vektor übergeben. Ich muss diese erst aus der Ausgangsfunktion auslesen und bekomme sie über
var=argnames(f_orig)
als Spaltenvektor:
'x1'
'x2'
'x3'
übergeben.
Leider mag es Matlab nicht, wenn ich diesen Vektor (transponiert) als Argumente für inline übergebe.
|
|
|
|
|
Hallo,
ja, mit formula und argnames sind die Möglichkeiten in Matlab schon erschöpft. Jetzt muss man basteln:
Sagen wir mal, f_orig ist eine inline-Funktion, die von x, y und z abhängig ist. Dann kriegen wir, wie du geschrieben hast, die Argumente in einem Cell-Array serviert per:
var=argnames(f_orig);
Nun können wir uns erstmal den nötigen Befehl als String zusammenbasteln und ihn am Ende ausführen.
Seien f und g die Funktionen, die wir an die Abhängigkeiten der Funktion f_orig anpassen wollen. Dann legen wir zuerst ihre Namen in einem Cell-Array ab:
functions_todo = {'f', 'g'};
%Nun können wir in einer for-Schleife alle Funktionsnamen abklappern:
for findex=1:length(functions_todo),
curr_funcname = char(functions_todo(findex));
eval_string = [curr_funcname ' = inline('];
eval_string = [eval_string sprintf('''%s''', formula(eval(curr_funcname)))];
for i=1:length(var),
eval_string = [eval_string sprintf(', ''%s''', char(var(i)))];
end;
eval_string = [eval_string ');'];
eval(eval_string);
end;
Hier wird für jeden Funktionsnamen der Befehl als String aufgebaut und dann per eval ausgeführt. Etwas Simpleres ist mir leider nicht eingefallen...
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:16 Di 19.12.2006 | Autor: | axes |
Danke dir :)
Habe schon geahnt, dass ich dann mit den Strings/C-Arrays tricksen müsste und gehofft es gäbe einen einfacheren Weg.
|
|
|
|