Domanda

Se ho un array (di lunghezza sconosciuta fino runtime), c'è un modo per chiamare una funzione con ogni elemento della matrice come un parametro a parte?

In questo modo:

foo = @(varargin) sum(cell2mat(varargin));
bar = [3,4,5];
foo(*bar) == foo(3,4,5)

Contesto: Ho una lista di indici ad una matrice n-d, Q. Quello che voglio è qualcosa di simile Q(a,b,:), ma ho solo [a,b]. Dal momento che non so n, non posso solo hard-code l'indicizzazione.

È stato utile?

Soluzione

Non c'è nessun operatore in MATLAB che lo farà. Tuttavia, se le indici (ossia bar nel tuo esempio) sono stati memorizzati in un , allora si potrebbe fare questo:

bar = {3,4,5};   %# Cell array instead of standard array
foo(bar{:});     %# Pass the contents of each cell as a separate argument

Il {:} crea un elenco separato da virgole da una matrice di celle. Questa è probabilmente la cosa più vicina si può arrivare al "gestore" formare hai nel tuo esempio, a parte ignorando uno dei Gli attuali operatori di (illustrata qui e qui ) in modo da generare un elenco separato da virgole da una matrice standard o creando una classe per memorizzare le indici e definendo come gli operatori esistenti operano per esso (nessuna delle due opzioni per i deboli di cuore!).

Per esempio specifico di indicizzazione di un array ND arbitraria, si potrebbe anche calcolare un indice lineare ai tuoi indici con indice usando l' sub2ind funzione (come dettagliato qui e qui ), ma si potrebbe finire per fare più lavoro di quanto si farebbe per la mia soluzione elenco separato da virgole sopra. Un'altra alternativa è quella di calcolare l'indice lineare di soli , che avrebbe Sidestep convertendosi in matrice di celle e utilizzare le operazioni unica matrice / vettore. Ecco un esempio:

% Precompute these somewhere:
scale = cumprod(size(Q)).';  %'
scale = [1; scale(1:end-1)];
shift = [0 ones(1, ndims(Q)-1)];

% Then compute a linear index like this:
indices = [3 4 5];
linearIndex = (indices-shift)*scale;
Q(linearIndex)  % Equivalent to Q(3,4,5)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top