2012-10-31 15 views
5

Quando si ha una funzione che richiede una quantità variabile di argomenti (come ndgrid), come si può passare un elenco arbitrario di argomenti a quella funzione?Come posso passare un set di un numero sconosciuto di argomenti a una funzione in MATLAB?

Per esempio io voglio fare in modo che a volte mi passa due vettori a ndgrid e uscire due matrici, vale a dire,

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

Ma altre volte avrei potuto avere più una X, quindi mi voglio

[X1,X2,X3,X4] = ndgrid(x1,x2,x3,x4) 
  1. esiste un tipo di struttura che posso utilizzare per memorizzare un elenco di un numero imprecisato di argomenti e poi basta dare tale elenco a una funzione? E,
  2. C'è un modo per recuperare tutte le uscite da una funzione, quando non sai quante ci saranno?
+0

un modo rapido e sporco sarebbe abstract l'input e l'output di un livello ("dimensione") e prendere una serie di ingressi e output un array - cioè [X] = ndgrid (x) dove X e x sono array di celle o qualcosa, con ogni elemento un vero elemento di input –

+0

Non sono abbastanza esperto, tuttavia, per dichiarare definitivamente se MATLAB ha un ' funzionalità di tipo varargs' (sono sicuro che faccia come può essere compilato in C) –

+0

oh è molto semplice: http://www.mathworks.com/help/matlab/ref/varargin.html –

risposta

5

Utilizzando varargin, nargin, varargout e nargout si può facilmente definire funzioni argomento/uscita variabili. Vedere il collegamento alla documentazione MATLAB allegato per la pagina varargin. Gli altri sono legati alla parte inferiore:

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

EDIT: BTW, non toot il mio proprio corno, ma sembra essere attuato proprio come avevo suggerito nella "quick-and-dirty" commento hehehe

6

a passare in un numero variabile di ingressi ad una funzione esistente, usare matrici di celle di espansione, in questo modo:

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

o

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

È possibile utilizzare lo stesso trucco per ricevere più numeri di uscite. L'unica parte difficile è ricordare le notazioni corrette.

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

Grazie! Questo e 'esattamente quello che stavo cercando. Ho pensato che avesse qualcosa a che fare con gli array di celle, ma non conoscevo la notazione. – rkp

0

una funzione che restituisce tutti gli argomenti come uscite:

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