Function 在函数体中调用倍频程插值函数

Function 在函数体中调用倍频程插值函数,function,octave,interpolation,wrapper,Function,Octave,Interpolation,Wrapper,我想把倍频程插值函数包装在函数体中 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

我想把倍频程插值函数包装在函数体中

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

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

正确方法:使用匿名函数 您应该使用匿名函数,这些函数可以在定义变量时捕获变量:

inter=@(p)interpn(x1,x2,x3,x4,x5,A,p(1),p(2),p(3),p(4),p(5),“样条曲线”);
现在
inter(p)
就像
inter
被声明为正常函数一样工作。但定义
inter
时定义的
x1
x2
等值将存储在
inter

如上所述,必须编写传递给的函数以接受函数句柄

错误的快速解决方案:使用全局变量 首先,创建一个包含以下内容的文件
inter.m

函数FUN=inter(p);
全局x1 x2 x3 x4 x5 A
FUN=interpn(x1,x2,x3,x4,x5,A,p(1),p(2),p(3),p(4),p(5),“样条曲线”);
结束
接下来,在调用
inter
的脚本函数中,再次声明全局变量(目前MATLAB警告您在给它们赋值之前应该将它们声明为全局变量,在未来的版本中这是必需的):

全局x1 x2 x3 x4 x5 A
x1=。。。
x2=。。。
%等
内部([10 2 4 3 4])
%或:
fminuit('inter',…)

我这样做了,但不起作用;package函数的格式如上所述;该函数由字符串定义,并从不同的文件中提取。你以前见过这样的结构吗?@damir:那一定是在函数句柄存在之前编写的非常古老的函数。真遗憾。我认为唯一的解决办法是让你的函数
inter
使用全局变量;它似乎遵循了“最小化文件指定的函数”的概念;嗯,你知道如何把我的“interpn”函数包装成这个;我很期待使用这个软件包来安装。哈哈。“Fminuit最初是为Matlab4.x开发的”。是的,当时没有函数句柄。哇,那是很久以前的事了!