在函数体内调用 Octave 插值函数

Calling Octave interpolation function within function body

我正在尝试将 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' 未定义,

当然函数体上面定义了向量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

鉴于您使用的是需要字符串作为函数的旧函数,下面的第一个解决方案将不起作用。然而,这是正确的方法。将旧函数更改为使用函数句柄而不是字符串将是我的首选解决方案。但是,您也可以在下面进一步使用替代解决方案,该解决方案使用全局变量。这不是推荐的方法 (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',...)