【问题标题】:Calling Octave interpolation function within function body在函数体内调用 Octave 插值函数
【发布时间】:2019-10-10 22:55:41
【问题描述】:

我正在尝试将 Octave 插值函数包装在函数体中,

function FUN = inter(p);
    FUN = interpn (x1, x2, x3, x4, x5, A, p(1), p(2), p(3), p(4), p(5), "spline");
end

我这样做的原因是因为我正在使用一个包,该函数需要一个字符串名称函数,在这种情况下是 packageFunction("inter", argument1);

问题现在正在调用,例如,

  disp("value = "), inter([10 2 4 3 4])

不起作用;没有看到向量错误:'x1' undefined ,

当然,向量 xi 和矩阵 A 是在函数体之上定义的。非常感谢这方面的建议,

谢谢,达米尔

---------- 在文件 example1.m 中

[a b c] = fminuit('gaussian','mnplot',[10 166 33],[x;y;dy])

---------- 在文件 gaussian.m 中

function f = gaussian(par,data);
%theoretical function
f = par(1)/(sqrt(2*pi)*par(3)) * exp(-.5*((data(1,:)- 
par(2))./par(3)).^2); 
if (size(data,1)==2),    %chi-square, error = 1
  f = sum((data(2,:) - f).^2);
 elseif (size(data,1)>2), %chi-square, error = 3rd row of data
 f = sum(((data(2,:) - f)./data(3,:)).^2);
end

【问题讨论】:

    标签: function octave interpolation wrapper


    【解决方案1】:

    鉴于您正在使用需要字符串作为函数的旧函数,下面的第一个解决方案将不起作用。然而,这是正确的做法。将旧函数更改为使用函数句柄而不是字符串将是我的首选解决方案。但是,您也可以使用下面的替代解决方案,它使用全局变量。这不是推荐的方法 (we should strive to avoid globals),但可以解决您近期的问题。

    正确方法:使用匿名函数

    您应该使用匿名函数,这些函数可以在定义变量时捕获它们:

    inter = @(p)interpn (x1, x2, x3, x4, x5, A, p(1), p(2), p(3), p(4), p(5), "spline");
    

    现在inter(p) 就像inter 被声明为一个普通函数一样工作。但是x1x2等在定义inter时定义的值将存储在inter中。

    如上所述,您传递inter 的函数必须编写为接受函数句柄。

    糟糕的快速解决方案:使用全局变量

    首先,创建一个文件inter.m,内容如下:

    function FUN = inter(p);
        global x1 x2 x3 x4 x5 A
        FUN = interpn (x1, x2, x3, x4, x5, A, p(1), p(2), p(3), p(4), p(5), "spline");
    end
    

    接下来,在您调用 inter 的脚本函数中,再次声明全局变量(目前 MATLAB 警告您应该在给它们赋值之前将它们声明为全局变量,在未来的版本中将需要这样做):

    global x1 x2 x3 x4 x5 A
    x1 = ...
    x2 = ...
    % etc
    
    inter([10 2 4 3 4])
    % or:
    fminuit('inter',...)
    

    【讨论】:

    • 我这样做了,但没有用; package 函数的格式如上;该函数由字符串定义并从不同的文件中提取。你以前见过这样的结构吗?
    • @damir:那一定是在函数句柄存在之前编写的一些非常古老的函数。可惜。我认为唯一的解决方法是让你的函数inter 使用全局变量。
    • 是的,包是 2011 年的;它似乎遵循“de.mathworks.com/help/matlab/ref/fminsearch.html”的概念,最小化文件指定的函数;嗯,你知道如何将我的“interpn”函数包装到这个里面吗?我期待着使用这个包进行拟合。
    • 哈哈。 “Fminuit 最初是为 Matlab 4.x 开发的”。是的,那时没有函数句柄。哇,那是很久以前的事了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 2015-03-08
    • 2017-08-01
    • 2012-01-12
    • 1970-01-01
    相关资源
    最近更新 更多