Как применить cellfun (или arrayfun или structfun) с постоянными дополнительными входными аргументами?

Я хочу применить функцию к каждому элементу массива ячеек, поэтому для этого у меня есть cellfun. Однако функция принимает два дополнительных аргумента (строку и вектор), которые я хочу сохранить постоянными для всех элементов массива ячеек; то есть я хотел бы сделать что-то вроде:

cellfun(@myfun, cellarray, const1, const2)

значение:

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

Есть ли способ сделать это без создания промежуточных массивов ячеек, содержащих numel(cellarray) копии const1 и const2?


person antony    schedule 19.07.2010    source источник


Ответы (2)


Это можно сделать с помощью анонимной функции, которая вызывает myfun с два дополнительных аргумента:

cellfun(@(x) myfun(x,const1,const2), cellarray)
person gnovice    schedule 19.07.2010
comment
В настоящее время я использую это решение, но есть ли другое? Для больших массивов это может привести к значительным накладным расходам. Является ли единственная альтернатива созданию массива копий const1, const2 (не очень хорошая альтернатива)? - person embert; 20.09.2014
comment
@embert Я не уверен, откуда берутся дополнительные накладные расходы, но, возможно, вы могли бы использовать профилировщик, чтобы узнать. Я бы также попробовал альтернативу цикла for в этом вопросе, поскольку циклы for не несут тех штрафов, которые они использовали в MATLAB (иногда они даже являются самой быстрой альтернативой). - person gnovice; 20.09.2014

Другой трюк — использовать ARRAYFUN для индексов:

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

если возвращаемые значения myfun не являются скалярами, вы можете установить параметр 'UniformOutput',false.

person Amro    schedule 19.07.2010