Matlab / Octave обработчики функций и nargin - PullRequest
0 голосов
/ 20 ноября 2011

Я пишу программу в Octave, и у меня возникла проблема, я реализовал квадратуру Гаусса-Легандра и передал своей функции Гаусса-Легандре несколько аргументов, и я передал функцию, которая будет интегрирована в куб ячейки, чтобы я мог передать немногие функционируют одновременно. У меня есть этот кусок кода:

    for weight=1:length(w)
        temp=1; 
        for fun=1:length(c)
            %liczenie iloczynu f(x_i)g(x_i), x_i - pieriwastki wielomianu Legandra
            f=c{fun};
            nargin(func2str(c{fun}))
            if (nargin (func2str(c{fun})) == 1)
                disp('a');
                temp*=c{fun}((b-a)/2 * x(weight) + (a+b)/2);
            else
                    (b-a)/2 * x(weight) + (a+b)/2;  
                temp*=f((b-a)/2 * x(weight) + (a+b)/2,I,points);
            end
        end
        %mnozenie wyniku przez odpowiedni wspolczynnik - wage
        temp*=w(weight);
        result+=temp;
    end

В массиве ячеек есть обработчики функций, которые я хочу интегрировать. В зависимости от количества аргументов, которые принимает функция, я хочу использовать два разных вызова функции. Если в массиве ячеек есть обработчик для функции, которая записана в файле .m в том же каталоге, что и мой рабочий каталог Octave, все работает нормально, но когда я определяю функцию во время выполнения Octave, например:

    function result=a(x)
    result=x*x
    end

Тип

    c{1}=@a

и передайте этот массив ячеек моей функции Квадратуры, есть ошибка nargin

    error: nargin: invalid function
    error: called from:

Почему это так и как я могу ее решить, чтобы я мог определять функции не только в файлах .m, но и в Octave.

1 Ответ

0 голосов
/ 21 ноября 2011

Я подозреваю, что у меня есть решение, но так как это зависит от октавы, и я в основном привык к 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, это может быть единственный способ получить то, что вы хотите для встроенных функций.

...