首页 文章

Matlab / Octave函数处理程序和nargin

提问于
浏览
0

我在Octave编写程序,我遇到了一个问题,我实现了Gauss-Legandre正交,我向Gauss-Legandre函数传递了一些参数,并且我将函数传递给了一个单元格多维数据集,所以我可以传递一些函数一时间我有这段代码:

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

在单元阵列中,有函数处理程序来处理我想要集成的函数 . 根据函数的参数数量,我想使用两个不同的函数调用 . 如果在单元格数组中有一个函数的处理程序,该函数写在与我的Octave工作目录相同的目录中的.m文件中,一切正常,但是当我在Octave运行时定义函数时,例如:

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

类型

c{1}=@a

并将此单元格数组传递给我的函数Kwadratury,存在一个nargin错误

error: nargin: invalid function
    error: called from:

为什么这样,我怎么解决它,所以我不仅可以在.m文件中定义函数,还可以在Octave中定义函数 .

1 回答

  • 0

    我怀疑我有一个解决方案,但由于这是Octave特定的,我主要习惯于MATLAB,你的里程可能会有所不同 .

    通过提供字符串参数调用 nargin 函数,这意味着 nargin 必须解析该函数并检查参数的数量 . 当您在线声明函数时,该函数是在该范围内定义的(即您的基本范围),因此解析函数名称将无法在任何函数内工作(或者它可能会解析为内置函数,甚至是更糟糕的行为) .

    最好的解决方案是使用 nargin(c{fun}) 而不是 nargin(func2str(c{fun})) . 这样你就可以传递实际的函数句柄,并且不需要将函数名解析为实际的函数,因此没有可能的歧义 .

    一般来说,我建议不要使用字符串来传递函数:为什么函数句柄包含在MATLAB中,所以读取代码的人(或静态代码分析工具)将能够理解你正在使用函数 . 当使用字符串时,一切都变得模棱两可:字符串 'a' 是指函数 a 还是字母表中的第一个字母?

    关于使用内联函数,我更容易通过 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
    

    您可能想要检查返回的错误 ME 是否确实表明使用了错误数量的参数来允许其他错误通过 . 我承认这是一个丑陋的解决办法,但由于Octave显然不支持 nargin 的函数句柄,它可能是你获得内联函数所需的唯一方法 .

相关问题