2016-03-19 6 views
0

Ich habe eine Funktion F, die als ein Vektor ein nimmt. Sowohl der Ausgang der Funktion als auch a sind Vektoren der Länge N, wobei N beliebig ist. Jede Komponente F n ist von der Form g (a (n), ein (n-k)), wo g das gleiche für jede Komponente ist.Verwenden Sie symbolische Matlab für flexible Anzahl von Argumenten und Funktionen

Ich möchte diese Funktion in Matlab mit seiner symbolischen Funktionalität zu implementieren und berechnen Sie seine Jacobi (und speichern Sie dann sowohl die Funktion und seine Jacobi als eine normale. M-Datei mit matlabFunction). Ich weiß, wie man das für eine Funktion macht, bei der jede Eingabe ein Skalar ist, der manuell gehandhabt werden kann. Aber hier möchte ich ein Skript, das in der Lage ist, diese Dateien für jedes N zu produzieren. Gibt es einen schönen Weg, dies zu tun?

Eine Lösung, die ich gefunden habe, besteht darin, ein Array von Strings "a0", "a1", ..., "aN" zu generieren und jede Komponente der Ausgabe mit eval zu definieren. Aber das ist unordentlich und ich frage mich, ob es einen besseren Weg gibt.

Vielen Dank!

[EDIT]

ist hier ein minimales Arbeitsbeispiel meiner aktuellen Lösung:

function F = F_symbolically(N) 

%generate symbols 
for n = 1:N 
    syms(['a',num2str(n)]); 
end 

%define output 
F(1) = a1; 
for n = 2:N 
    F(n) = eval(sprintf('a%i + a%i',n,n-1)); 
end 
+1

Bitte fügen Sie Beispielcode in Ihre Frage ein, um Ihr Problem zu demonstrieren, entweder eine Version für eine feste Anzahl von Argumenten oder Ihre 'eval' Lösung. Ich bin mir sicher, dass es besser gemacht werden kann, aber ich weiß nicht, ob ich Komma-getrennte Listen erklären muss, wie die symbolische Toolbox mit Vektoren oder beiden arbeitet. – Daniel

+2

[Verwenden Sie keine dynamischen Variablennamen] (http://StackOverflow.com/a/32467170/5211833) es ist schlecht. MATLAB hat mehrere Datencontainerformate, die für diese Aufgabe sehr geeignet sind, wie Strukturen. – Adriaan

+1

kennen Sie die Syntax: 'a = sym ('a', [1 N])', die dann als 'a (i)' zugegriffen werden kann? – Amro

Antwort

2

Try this:

function F = F_symbolically(N) 
    a = sym('a',[1 N]); 
    F = a(1); 
    for i=2:N 
     F(i) = a(i) + a(i-1); 
    end 
end 

Beachten Sie die Verwendung von sym Funktion (nicht syms) zu Erstellen Sie ein Array von symbolischen Variablen.

+0

Nicht sicher, wie repräsentativ das Beispiel des OP ist, aber der Funktionskörper könnte ersetzt werden durch 'F = cumsum (sym ('a', [1 N]));'. – horchler

+1

Nicht ganz, die Funktion oben berechnet nur die Summe der aktuellen und vorherigen Begriffe, nicht kumulativ den ganzen Weg bis zum Anfang .. Sowieso Vektorisierung ist nicht das Hauptanliegen hier, ich bin sicher, dass wir es mit etwas wie F = [tun können a (1), a (1: Ende-1) + a (2: Ende)] – Amro