2016-12-02 2 views
4

Вот ситуация: мне нужно создать функцию, которая принимает функцию обрабатывать fun которая имеет ПОСТОЯННОГО ввод длиной (то есть nargin(fun)>=0), делают некоторые преобразования на входах и затем вызывает fun. Псевдо-код:Создать функцию с заданным числом входных аргументов

function g = transformFun(fun) 
n = nargin(fun); 
g = @(v_1, ..., v_n) ... 
%   ^NOT REAL MATLAB - THE MAIN PROBLEM 
    fun(someCalculationsWithSameSizeOfOutput(v_1,...v_n){:}); 
% CAN BE ACHIEVED WITH TEMPORARY CELL IN HELPER FUNCTION^
end 

Теперь проблема: ручка выходной функции (в g = transformFun(concreteFun)) затем передается другой код, который опирается на тот факт, что функция является постоянной длины (предполагается, что nargin(g)>=0), таким образом, с переменной функция входной длины неприемлема («простое» решение).

Это преобразование называется множеством функций с любым возможным числом аргументов (n неограничен), поэтому также невозможно охватить конечное число возможностей.

Есть ли способ (простой?) Для достижения этого?

[Я искал интернет в течение нескольких часов и мог только придумать неприятный взломать с использованием устаревшей функции inline, которую я не мог сделать; возможно, у меня неправильная терминология].

+0

Должна ли быть 'g' допрошена с помощью' nargin'? – Suever

+1

Я думаю, что ваша формулировка делает проблему более сложной. Вы хотите, чтобы 'fun' мог обрабатывать ** переменную ** количество входов, а не ** константу **, правильно? –

+0

@Suever Это верно –

ответ

4

Так обычно вы можете использовать varargin для обработки такого рода вещей, но так как вам нужно nargin(g) вернуть фактическое количества входов, это немного сложнее.

Вы можете использовать str2func, чтобы создать анонимную функцию в виде строки, а затем преобразовать ее в дескриптор функции.

% Create a list or arguments: x1, x2, x3, x4, ... 
args = sprintf('x%d,', 1:nargin(func)); 
args(end) = ''; 

% Place these arguments into a string which indicates the function call 
str = sprintf('@(%s)fun(someCalculationsWithSameSizeOfOutput(%s))', args, args); 

% Now create an anonymous function from this string 
g = str2func(str); 

Основываясь на величине выше, возможно, стоит рассмотреть альтернативный способ борьбы с вашими функциями.

+0

Brilliant! Спасибо! –

+0

Это общение с кодом других людей, так что это немного сложно, но я не мог согласиться больше –

Смежные вопросы