2012-10-31 1 views
5

Wenn Sie eine Funktion haben, die eine variable Anzahl von Argumenten (wie ndgrid) benötigt, wie können Sie eine willkürliche Liste von Argumenten an diese Funktion übergeben?Wie kann ich eine Menge einer unbekannten Anzahl von Argumenten an eine Funktion in MATLAB übergeben?

Zum Beispiel möchte ich es machen, so dass ich manchmal zwei Vektoren passieren ndgrid und zwei Matrizen zu erhalten, dh,

[X1,X2] = ndgrid(x1,x2); 

Aber auch andere Zeiten, ich könnte mehr X habe, ich werde

so will
[X1,X2,X3,X4] = ndgrid(x1,x2,x3,x4) 
  1. gibt es irgendeine Art von Struktur kann ich eine Liste von einer unbekannten Anzahl von Argumenten speichern verwenden und dann gebe sie nur diese Liste auf eine Funktion? Und,
  2. Gibt es eine Möglichkeit, alle Ausgaben von einer Funktion abzurufen, wenn Sie nicht wissen, wie viele es sein wird?
+0

eine schnelle und schmutzige Weise zu abstrahieren Ihre Eingangs- und Ausgangs bis ein Pegel („Dimension“) und nehmen eine Reihe von Eingaben wären und gib ein Array aus - das ist [X] = ndgrid (x) wobei X und x Zellenarrays sind, mit jedem Element ein aktuelles Eingabeelement –

+0

Ich bin jedoch nicht versiert genug, um definitiv zu sagen, ob MATLAB ein ' varargs' Typ Funktionalität (Ich bin mir sicher, dass es tut, wie es in C kompilieren kann) –

+0

oh es ist bemerkenswert einfach: http://www.mathworks.com/help/matlab/ref/varargin.html –

Antwort

5

Mit varargin, nargin, varargout und nargout Sie können leicht variable Argument/Ausgabe-Funktionen definieren. Siehe den angehängten MATLAB-Dokumentationslink für die varargin-Seite. Die anderen sind an der Unterseite verbunden:

http://www.mathworks.com/help/matlab/ref/varargin.html

EDIT: BTW, nicht mein eigenes Horn zu blasen, aber es scheint, umgesetzt werden, so wie ich in der „quick-and-dirty“ Kommentar hehehe vorgeschlagen hatte

6

um in einer variablen Anzahl von Eingängen zu einer vorhandenen Funktion verwenden Zellenanordnungen mit Expansion, wie dies passiert:

x = 1:10; 
y = randn(size(x)); 
plotArguments = {'color' 'red' 'linestyle' '-'}; 
plot(x, y, plotArguments{:}); 

oder

plotArguments = {1:10 randn(1,10) 'color' 'red' 'linestyle' '-'}; 
plot(plotArguments{:}); 

Sie können denselben Trick verwenden, um mehrere Ausgänge zu empfangen. Der einzige schwierige Teil ist, sich an die richtigen Schreibweisen zu erinnern.

numArgumentsToAccept = 2; 
[results{1:numArgumentsToAccept }] = max(randn(100,1)); 
+0

Danke! Genau das habe ich gesucht. Ich dachte, es hätte etwas mit Zellenarrays zu tun, aber ich kannte die Notation nicht. – rkp

0

eine Funktion, die alle Argumente als Ausgänge zurück:

function varargout = ndgrid(varargin)  
    varargout = varargin; 
return