2017-11-27 12 views
1

Dies wird vereinfacht, sondern nimmt als Beispiel die folgenden MATLAB-Funktion Griff:Wie weisen Sie Variablen in einer Handle-Funktion Werte zu?

F = @(x)[x(1)-x(2);x(2)-x(3)] 

Das System hat natürlich viele Lösungen. Ist es möglich, eine Lösung für eine Funktion wie diese zu erhalten, nachdem mindestens eine Variable ersetzt wurde? Zum Beispiel ersetzt x(3)=1 würde die Funktion werden:

G = @(x)[x(1)-x(2);x(2)-1] 

und eine Lösung für die anderen Variablen erhalten werden. Ich benutze fsolve und es funktioniert ziemlich gut für das System von Gleichungen, die ich habe. Natürlich kann ich mit der Symbolic Toolbox arbeiten, aber wenn ich sie in einer großen For-Schleife anrufe, ist es zu langsam für meinen Code.

Ich versuche, mit Code zu kommen, der G gegeben F und eine Reihe von Indizes in x mit gegebenen Werten ersetzen kann.

+1

Mögliche Duplikat [Konvertieren Eingang einer anonymen Funktion] (https://stackoverflow.com/questions/47486471/convert -input-of-anonyme-Funktion) –

+0

Schönes Beispiel. Fast was ich tun muss. Der Unterschied besteht darin, dass zur Auswertung von F ich x verwende, was ein Vektor ist. Kann dies mit Vektoren gemacht werden? Denken Sie an die folgende Funktion: 'Funktion G = konvertieren (F, x, xMatrix)' Wo XMatrix angibt, welche Variablen ersetzt werden sollen. Wenn beispielsweise x = [3,2,1] und xMatrix = [0,0,1], bedeutet dies, dass G 'G = @ (x) [x (1) -x (2); x (2) -1] ' Kann dies getan werden? – ser

+0

@SardarUsama: Es ist komplizierter als das, da es indizierte Elemente im Argument ersetzt, anstatt ein ganzes Eingabeargument zu ersetzen. – gnovice

Antwort

0

Was sind Sie im Grunde zu tun zu fragen, ist G Anruf F mit Werten in x basierend index und eine Reihe von Ersatz auf einem logischen Ersatz Indexwerte values neu zugeordnet haben, was machbar ist, aber chaotisch, da anonymous functions nur ein einziges haben ausführbar Erklärung.

Die Lösung ist ähnlich wie in this answer getan, aber anstelle der Verwendung des funktionalen Formulars für subskribierte Referenz müssen wir das funktionale Formular für die subskribierte Zuordnung verwenden: . Hier ist, wie es aussehen würde:

F = @(x)[x(1)-x(2); x(2)-x(3)]; 
values = [3 2 1]; 
index = logical([0 0 1]); 
G = @(x) F(subsasgn(x, struct('type', '()', 'subs', {{index}}), values(index))); 

Und hier ist ein Test:

>> F([3 2 3]) 

ans = 

    1 
    -1 

>> F([3 2 1]) % Replace the last element by 1 

ans = 

    1 
    1 

>> G([3 2 3]) % G handles replacing the last element by 1 

ans = 

    1 
    1 
+0

Das funktioniert perfekt. Es ist schnell und fsolve löst nicht für die substituierten Werte, was genau das ist, was ich brauche. Könnte chaotisch sein (es ist nicht leicht zu verstehen), aber es sieht effizient aus. Große Programmierkenntnisse! Millionen Dank. – ser

+0

@ser: Glücklich zu helfen! Vergiss nicht, dass du die Antworten als akzeptiert markieren kannst (https://stackoverflow.com/help/accepted-answer). – gnovice

Verwandte Themen