2010-07-19 7 views
9

Quiero aplicar una función a cada elemento de una matriz de celdas, así que tengo cellfun para eso. Sin embargo, la función toma dos argumentos adicionales (una cadena y un vector), que quiero mantener constante para todos los elementos de la matriz de celdas; es decir, me gustaría hacer algo como:¿Cómo aplicar cellfun (o arrayfun o structfun) con argumentos de entrada adicionales constantes?

cellfun(@myfun, cellarray, const1, const2) 

significa:

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

¿Hay alguna manera de hacerlo sin crear matrices de células intermedias que contienen copias de numel(cellarray)const1 y const2?

Respuesta

16

Esto se puede hacer utilizando un anonymous function que llama myfun con los dos argumentos adicionales:

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

Actualmente estoy usando esta solución, pero ¿hay alguna otra? Para arreglos grandes, puede producir una cantidad considerable de sobrecarga. ¿Es la única alternativa para crear una matriz de copias de 'const1, const2' (no es una buena alternativ)? – embert

+1

@embert No estoy seguro de dónde vendría la sobrecarga adicional, pero quizás podrías usar el generador de perfiles para averiguarlo. También probaría la alternativa for loop en la pregunta, ya que los bucles for no incurren en el tipo de penalización que solían tener en MATLAB (a veces incluso son la alternativa más rápida). – gnovice

4

Otro truco es usar ARRAYFUN en los índices:

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

si los valores de retorno de myfun no son escalares, es posible que desee establecer la opción 'UniformOutput',false.

Cuestiones relacionadas