2011-11-20 89 views
0

我正在写程序在八度和我遇到了一个问题,我实现了高斯 - Legandre正交和我传递给我的高斯 - Legandre函数几个参数,我传递函数被集成在一个细胞立方体,所以我一次只能传递很少的功能。我有这段代码:Matlab /八度功能处理程序和nargin

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文件在同一目录作为我的倍频工作目录一切正常,但是当我在八度定义函数运行时间,例如功能:

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

键入

c{1}[email protected] 

,并通过该电池阵列我的功能Kwadratury有nargin

error: nargin: invalid function 
    error: called from: 

这是为什么,我怎么能解决这个问题,这样我就可以将f的错误不仅在.m文件中,而且在Octave中也是如此。

回答

0

我怀疑我有一个解决方案,但由于这是八度特定的,我大多习惯于MATLAB,所以您的里程可能会有所不同。

您可以通过提供字符串参数来调用nargin函数,这意味着nargin必须解析该函数​​并检查参数的数量。当你在线声明一个函数时,该函数被定义在该范围内(即你的基本范围),所以解析函数名称将不会在任何函数内工作(或者它可能会解析为一个内置函数,更坏的行为)。

最好的解决办法是用nargin(c{fun})代替nargin(func2str(c{fun}))。这样你就可以传递实际的函数句柄,并且不需要将函数名称解析为实际的函数,因此不存在可能的歧义。

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

关于使用内联函数,我不知道Octave是否支持这种功能,但如果您的功能非常简单,那么定义一个匿名函数(例如a = @(x)(x*x);)更容易。这是一个由MATLAB支持的结构,这样可以使您的代码更容易移植到其他环境中(当然,您仍然需要使用代替X *= A以兼容MATLAB)。

编辑: 另一种可能只是尝试用多种参数的形式是否可行,回落到一个参数的形式,必要时:

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的函数句柄,所以它可能是获得内联函数所需的唯一方法。

+0

我开始使用func2str,因为Octave中的nargin只接受一个字符串,但无论如何,我通过让我的单元格还有其他参数来解决我的问题,所以当我知道我的函数接受3个变量时,我只是从c {fun ,2}等,我把所有的函数放在单独的文件中,所以不用担心范围。 – Andna

+0

正如我之前所说的,我通过在自己的文件中包含每个函数来解决我的问题,需要那些内联函数来加速我对自己的代码的测试,但是我没有,但是感谢您的帮助:)。 – Andna