www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Matlab" - Funktionsvariablen erweitern
Funktionsvariablen erweitern < Matlab < Mathe-Software < Mathe < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Funktionsvariablen erweitern: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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.

        
Bezug
Funktionsvariablen erweitern: Antwort
Status: (Antwort) fertig Status 
Datum: 20:31 So 17.12.2006
Autor: Martin243

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

Bezug
                
Bezug
Funktionsvariablen erweitern: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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

Bezug
                
Bezug
Funktionsvariablen erweitern: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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.








Bezug
                        
Bezug
Funktionsvariablen erweitern: Antwort
Status: (Antwort) fertig Status 
Datum: 23:01 Mo 18.12.2006
Autor: Martin243

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

Bezug
                                
Bezug
Funktionsvariablen erweitern: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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.



Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]