在函数体内调用 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
被声明为普通函数一样工作。但是 x1
、x2
等在定义 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',...)
我正在尝试将 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
被声明为普通函数一样工作。但是 x1
、x2
等在定义 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',...)