2009-07-15 3 views
3

gelesen habe ich eine Funktion mit variablen Argumenten, auf die übliche Weise erklärt:variabler Länge MATLAB Argumente Variable

[] = foo (varargin) 

und ich möchte es von einer anderen Funktion nennen, aber die Argumente programmatisch festlegen. Mein bester Versuch ist so etwas wie die folgende:

% bar isn't populated like this, but this is how it ends up 
bar = { 'var1' 'var2' 'var3' }; 
foo(bar); 

jedoch bar in ein 1x1-Zellenfeld gesetzt wird, und nicht als 1x3 Zellenfeld interpretiert, wie ich gedacht. Ich kann foo nicht ändern, also gibt es einen Workaround?

+1

Der Aufruf cell() ist deaktiviert. Die Funktion cell() erstellt leere Zellenarrays. Um Werte in eine Zelle einzufügen, verwenden Sie die Syntax {}. bar = {var1 var2 var3}; –

+0

Danke. So ist der wirkliche Code tatsächlich. Es war verloren in der Verallgemeinerung. –

Antwort

10

Wenn Sie Variablen a, b und c, die Sie zusammen irgendwo abholen wollen und letztlich als eine Reihe von Eingaben an eine Funktion übergeben, können Sie wie folgt vorgehen:

inArgs = {a b c}; % Put values in a cell array 
foo(inArgs{:}); 

Die Syntax inArgs{:} Extrakte alle Werte aus dem Zellen-Array als comma-separated list. Die obige entspricht daher folgendermaßen aus:

foo(a,b,c); 

Wenn foo ein variable-length argument list annimmt geschrieben wird, dann wird die Variable varargin wird ein 1-mal-3-Zellen-Array am Ende wird, wobei jedes Element ein separates speichert Eingabeargument. Grundsätzlich wird varargingenau wie die Variable inArgs aussehen. Wenn Ihr Anruf foo nicht den {:} Operator hat:

foo(inArgs); 

dann die varargin Variable wäre ein 1-by-1 Zellenfeld, wo das erste Element selbst die Zellenmatrix inArgs. Mit anderen Worten, foo hätte nur einen Eingang (ein 1-mal-3-Zellen-Array).

0

Die einzige Möglichkeit, die mir bekannt ist, ist eval zu verwenden, jedoch habe ich MATLAB hier nicht, also kann ich die Syntax nicht richtig überprüfen.

Wenn Sie die Bar in einen String der Form "'var1', 'var2', 'var3'" zwingen, können Sie tun:

eval(["foo(", barString, ")"]) 

Hoffnung, dass Sie gehen und leider wird es keine umfassende Antwort.

+0

die Syntax {:} sieht jedoch besser aus! – DrAl

+1

Beachten Sie, dass eval in den letzten Versionen von Matlab nicht nur sehr langsam ist, sondern auch seltsame Semantiken aufweist, in denen es manchmal Variablennamen und Funktionsnamen verwirren kann. Hier ist eine Person, die in die Gotcha gerannt ist: http://www.mathworks.co.uk/matlabcentral/newsreader/view_thread/237730 –