2010-07-19 10 views
9

Voglio applicare una funzione a ciascun elemento di un array di celle, quindi ho cellfun per quello. Tuttavia, la funzione accetta due argomenti aggiuntivi (una stringa e un vettore), che voglio mantenere costante per tutti gli elementi dell'array di celle; cioè mi piacerebbe fare qualcosa di simile:Come applicare cellfun (o arrayfun o structfun) con argomenti di input aggiuntivi costanti?

cellfun(@myfun, cellarray, const1, const2) 

significa:

for i = 1:numel(cellarray), 
    myfun(cellarray{i}, const1, const2); 
end 

C'è qualche modo per farlo senza creare array di celle intermedi contenenti numel(cellarray) copie di const1 e const2?

risposta

16

È possibile farlo utilizzando un anonymous function che chiama myfun con i due argomenti aggiuntivi:

cellfun(@(x) myfun(x,const1,const2), cellarray) 
+0

Attualmente sto usando questa soluzione, ma ce n'è un'altra? Per i grandi array può produrre una notevole quantità di overhead. È l'unica alternativa per creare una serie di copie di 'const1, const2' (non un buon alternativ)? – embert

+1

@embert Non so da dove arriverà l'overhead aggiuntivo, ma forse potresti usare il profiler per scoprirlo. Vorrei anche provare l'alternativa for loop nella domanda, dato che per loop non si incorre nel tipo di penalità a cui erano abituati in MATLAB (a volte sono anche l'alternativa più veloce). – gnovice

4

Un altro trucco è quello di utilizzare ARRAYFUN sugli indici:

arrayfun(@(k) myfun(cellarray{k},const1,const2), 1:numel(cellarray)) 

se i valori di ritorno di myfun non sono scalari, potresti voler impostare l'opzione 'UniformOutput',false.

Problemi correlati