Вероятно, нет веской причины избегать очевидной рекурсивной конструкции. Он прост, легко читается и поддерживается, и должен иметь довольно хорошую производительность.
function out = aggregate_inputs(fHandle, varargin)
if nargin>3
out = fHandle(varargin{1},aggregate_inputs(fHandle,varargin{2:end}));
elseif nargin <= 3
out = fHandle(varargin{:});
end
Не такой элегантный, но (возможно, *) требующий меньше памяти, - это конструкция цикла
function accumulate = aggregate_inputs(fHandle,varargin)
if nargin<=3
accumulate = fHandle(varargin{:});
else
accumulate = fHandle(varargin{end-1},varargin{end});
for ix = (length(varargin)-2):-1:1
acumulate = fHandle(varargin{ix}, accumulate);
end
end
Конечно, ваш вопрос снял эти конструкции с рассмотрения ... так что на самом деле нет хорошего способа сделать это, что я вижу.
Если говорить о философии на минуту, то верно, что многие операции с Matlab могут выполняться намного быстрее с помощью векторизованных вызовов. Иногда это интерпретируется как «избежать петли любой ценой». Однако избегание циклов с вызовами cellfun, arrayfun или (пожалуйста, нет) eval, как правило, не повышает производительность. Иногда это правильно делать по другим причинам ... но это не помогает "векторизовать ваш код, чтобы сделать его быстрее".
* «Возможно» выше просто потому, что я не уверен, насколько хорошо ленивое копирование при записи Matlab и другие оптимизации предотвратят использование памяти, которое кажется потенциальной опасностью при рекурсивном решении.