2013-02-25 11 views
5

Se io chiamo una funzione MATLAB con: func (1,2,3,4,5) funziona perfettamente.desidera utilizzare un vettore come parametro a una funzione, senza la necessità di separare i suoi elementi

Ma se faccio: a = [1,2,3,4,5]% (un [1, 2, 3, 4, 5] spedisce stesso risultato)

poi :

func (una)

mi dà:

??? Errore ==> func su 11 Argomenti di input insufficienti.

Linea 11 in func.m è:

errore

(nargchk (5, 6, nargin));

mi accorgo che questo funziona perfettamente:

func (una (1), A (2), A (3), A (4), una (5))

Come posso utilizzare il vettore 'a' come parametro per una funzione? Ho un'altra funzione otherfunc (b) che restituisce un, e vorrei usare il suo output come un parametro come questo func (otherfunc (b)).

+0

possibile duplicato di [Funzione di chiamata con numero variabile di parametri in Matlab] (http://stackoverflow.com/questions/12741843/calling-function-with-varying-number-of-parameters-in-matlab) – user502144

risposta

0

Basta fare in modo che la funzione utilizzi un singolo argomento.

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

Poiché argomenti delle funzioni in Matlab stessi possono essere vectoes (o anche matrici) non è possibile sostituire diversi argomenti con un singolo vettore.
Se func prevede 5 argomenti, non è possibile passare un singolo vettore e si aspetta che matlab comprenda che tutti e cinque gli argomenti sono elementi nel vettore. In che modo Matlab può dire la differenza tra questo caso e un caso in cui il primo argomento è un vettore a 5?

Quindi, vorrei suggerire questa soluzione

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

non sono sicuro se questo funziona (non ho MATLAB qui), ma la logica è quella di convertire il 5-vettore a (l'uscita di otherfunc(b)) in un array di celle e quindi espanderlo come 5 argomenti diversi a func.
Per favore non la differenza tra a{:} e a(:) in questo subsref.

3

Forse potresti provare con nargin: una variabile in una funzione che ha il valore del numero di argomenti di input. Dato che hai bisogno di input di lunghezza diversa, credo che questo possa essere meglio gestito con varargin, che può essere impostato come ultima variabile di input e quindi raggrupperà tutti gli argomenti di input aggiuntivi.

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} 

ho scritto x1...x5 per le variabili di input

0

Si potrebbe creare una funzione della forma seguente:

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 

Nel qual caso, funeval(func, a) dà la potenza richiesta.

0

Uso 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) può essere passato a funzioni come elenco parametri,

così quello che serve è un CSL come 1,2,3,4,5 costruita da un array.

Può essere generato usando matrice di celle simili:

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

altro metodo sarebbe quello di creare una funzione linea separata. Diciamo che avere una funzione f che prende più parametri:

f = f(x1,x2,x3) 

è possibile chiamare questo con una serie di valori dei parametri attraverso la definizione di una funzione g separata:

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

Ora, se si dispone di un vettore di parametri valori v = [1,2,3], sarete in grado di chiamare f (v (1), v (2), v (3)) usando g (v).

Problemi correlati