2013-02-25 3 views
5

zu trennen, die Wenn ich eine Matlab-Funktion mit rufen: func (1,2,3,4,5) es perfekt funktioniert.Möchten Sie einen Vektor als Parameter an eine Funktion verwenden, ohne seine Elemente

Aber wenn ich tue: a = [1,2,3,4,5]% (a [1; 2; 3; 4; 5] ergibt gleiches Ergebnis)

dann :

func (a)

gibt mir:

??? Fehler ==> func um 11 Nicht genügend Eingabeargumente.

Zeile 11 in func.m ist:

Fehler (nargchk (5, 6, nargin));

merke ich, dass diese perfekt funktioniert:

func (a (1), A (2), A (3), A (4), eine (5))

Wie kann ich den Vektor 'a' als Parameter für eine Funktion verwenden? Ich habe eine andere Funktion otherfunc (b), die eine zurückgibt, und möchte seine Ausgabe als Parameter wie diese verwenden func (otherfunc (b)).

+0

mögliches Duplikat von [Calling-Funktion mit variierender Anzahl von Parametern in Matlab] (http://stackoverflow.com/questions/12741843/calling-function-with-varying-number-of-parameters-in-matlab) – user502144

Antwort

0

Machen Sie die Funktion einfach ein Argument.

function result = func(a) 
    if ~isvector(a) 
     error('Input must be a vector') 
    end 
end 
0

Da Argumente an Funktionen in Matlab können sich vectoes (oder sogar Matrizen) werden Sie nicht mehrere Argumente mit einem einzigen Vektor ersetzen kann.
Wenn func 5 Argumente erwartet, können Sie keinen einzelnen Vektor übergeben und erwarten, dass Matlab versteht, dass alle fünf Argumente Elemente im Vektor sind. Wie kann Matlab den Unterschied zwischen diesem Fall und einem Fall erklären, in dem das erste Argument ein 5-Vektor ist?

Also, ich würde diese Lösung vorschlagen

s.type = '()'; 
s.subs = {1:5}; 
func(subsref(num2cell(otherfunc(b)), s)) 

Ich bin nicht sicher, ob das funktioniert (ich habe nicht Matlab hier), aber die Logik ist der 5-Vektor a (die Ausgabe zu konvertieren von otherfunc(b)) in ein Zellenarray und dann erweitern Sie es als 5 verschiedene Argumente zu func.
Bitte nicht den Unterschied zwischen a{:} und a(:) in diesem subsref.

3

Vielleicht könnten Sie versuchen mit Nargin - eine Variable in einer Funktion, die den Wert der Anzahl der Eingabeargumente hat. Da Sie eine Eingabe mit unterschiedlicher Länge benötigen, glaube ich, dass dies am besten mit varargin gehandhabt werden kann, das als letzte Eingabevariable festgelegt werden kann und dann alle zusätzlichen Eingabeargumente zusammenfasst.

function result = func(varargin) 
    if nargin == 5: % this is every element separately 
     x1 = varargin{1} 
     x2 = varargin{2} 
     x3 = varargin{3} 
     x4 = varargin{4} 
     x5 = varargin{5} 
    else if nargin == 1: % and one vectorized input 
     [x1 x2 x3 x4 x5] = varargin{1} 

I x1...x5 für Ihre Eingangsvariablen

0

geschrieben haben, Sie könnten eine Funktion der folgenden Form erstellen:

function [ out ] = funeval(f, x) 
    string = 'f('; 
    for I = 1:length(x) 
     string = strcat(string, 'x(' , num2str(I), '),'); 
    end 
    string(end) = ')'; 
    out = eval(string); 
end 

In diesem Fall gibt funeval(func, a) die erforderliche Leistung.

0

Verwendung eval:

astr = []; 
for i=1:length(a) 
    astr  = [astr,'a(',num2str(i),'),']; % a(1),a(2),... 
end 
astr = astr(1:end-1); 
eval(['func(' astr ');']); 
5

Comma-seperated lists (CSL) können Funktionen wie Parameterliste übergeben werden,

so, was Sie brauchen, ist ein CSL als 1,2,3,4,5 aus einem Array aufgebaut.

Es kann erzeugt werden unter Verwendung von Zellenfeld wie folgt aus:

a=[1,2,3,4,5]; 
c = num2cell(a); 
func(c{:}); 
1

Eine andere Methode wäre eine separate Inline-Funktion zu erstellen. Sagen Sie bitte eine Funktion f haben, die mehrere Parameter verwendet: Sie können diese rufen mit einer Reihe von Parameterwerten

f = f(x1,x2,x3) 

durch eine separate Funktion g definieren:

g = @(x) f(x(1),x(2),x(3)) 

Nun, wenn Sie einen Vektor haben Parameter Werte v = [1,2,3], Sie können f (v (1), v (2), v (3)) mit g (v) aufrufen.

Verwandte Themen