Я подозреваю, что у меня есть решение, но так как это зависит от октавы, и я в основном привык к MATLAB, ваш пробег может отличаться.
Вы вызываете функцию nargin
, предоставляя строковый аргумент,это означает, что nargin
придется разрешить эту функцию и проверить количество аргументов.Когда вы объявляете функцию в строке, эта функция определяется в этой области (т. Е. В вашей базовой области), поэтому разрешение имени функции не будет работать внутри какой-либо функции (или оно может преобразоваться во встроенную функцию, которая дажехудшее поведение).
Лучшее решение - использовать nargin(c{fun})
вместо nargin(func2str(c{fun}))
.Таким образом, вы передаете фактический дескриптор функции, и нет необходимости преобразовывать имя функции в реальную функцию, и, следовательно, нет никакой двусмысленности.
В общем, я рекомендую не использовать строки для передачи функций: вот почемудескрипторы функций включены в MATLAB, поэтому любой, кто читает ваш код (или инструмент статического анализа кода), сможет понять, что вы работаете с функциями.При использовании строк все становится неоднозначным: относится ли строка 'a'
к функции a
или к первой букве в алфавите?
Что касается использования встроенных функций, я не знаю, поддерживает ли это Octave, но если вы работаете довольно просто, проще определить анонимную функцию, такую как ваш пример, с помощью a = @(x)(x*x);
.Это конструкция, поддерживаемая MATLAB, что делает ваш код более переносимым в другие среды (ну, вам все равно придется заменить X *= A
на X = X * A;
для совместимости с MATLAB).
edit: Другая возможность может состоять в том, чтобы просто проверить, работает ли форма с несколькими параметрами, и при необходимости вернуться к форме с одним параметром:
try
(b-a)/2 * x(weight) + (a+b)/2;
temp*=f((b-a)/2 * x(weight) + (a+b)/2,I,points);
catch ME
try
disp('a');
temp*=c{fun}((b-a)/2 * x(weight) + (a+b)/2);
catch ME
end
end
Возможно, вы захотите проверить, возвращена ли возвращенная форма.error ME
действительно утверждает, что для пропуска других ошибок используется неверное количество аргументов.Я признаю, что это уродливый обходной путь, но поскольку Octave, очевидно, не поддерживает дескрипторы функций для nargin
, это может быть единственный способ получить то, что вы хотите для встроенных функций.