我有3个简短的函数,我在Matlab中的3个单独的m文件中编写。
main函数名为F_,接受一个输入参数并返回一个包含3个元素的向量。
F_输出的元素1和2是(应该是)使用其他2 m文件中的函数计算的,现在我们称之为theta0_和theta1_。
以下是代码:
function Output = F_(t)
global RhoRF SigmaRF
Output = zeros(3,1);
Output(1) = theta0(t);
Output(2) = theta1(t) - RhoRF(2,3)*sqrt(SigmaRF(2,2))*sqrt(SigmaRF(3,3));
Output(3) = -0.5*SigmaRF(3,3);
end
和
function Output = theta0_(t)
global df0dt a0 f0 SigmaRF
Output = df0dt(t) + a0 + f0(t) + SigmaRF(1,1)/(2*a0)*(1-exp(-2*a0*t));
end
和
function Output = theta1_(t)
global df1dt a1 f1 SigmaRF
Output = df1dt(t) + a1 + f1(t) + SigmaRF(2,2)/(2*a1)*(1-exp(-2*a1*t));
end
我已经为这些函数创建了句柄,如下所示:
F = @F_;
theta0 = @theta0_;
theta1 = @theta1_;
当我使用任何t
值的句柄运行F_时,我收到以下错误:
F_(1)
Undefined function 'theta0' for input arguments of type 'double'.
Error in F_ (line 9)
Output(1) = theta0(t);
请协助。我在这里做错了什么?
我只希望能够从另一个中调用一个函数。
答案 0 :(得分:2)
每个函数都有自己的工作区,因为你没有在函数theta0
的工作空间内创建F_
,所以会出错。
您可能不需要额外的间接级别,并且可以在函数中使用theta0_
。
如果确实需要额外的间接级别,您可以选择以下几种方法:
将函数句柄作为参数传递:
function Output = F_ ( t, theta0, theta1 )
% insert your original code here
end
使F_
成为嵌套函数:
function myscript(x)
% There must be some reason not to call theta0_ directly:
if ( x == 1 )
theta0=@theta0_;
theta1=@theta1_;
else
theta0=@otherfunction_;
theta1=@otherfunction_;
end
function Output = F_(t)
Output(1) = theta0(t);
Output(2) = theta1(t);
end % function F_
end % function myscript
使函数句柄处于全局状态。您必须在F_
以及设置theta0
和theta1
的位置执行此操作。并确保不要在程序中的其他位置使用具有相同名称的全局变量来表示不同的内容。
% in the calling function:
global theta0
global theta1
% Clear what is left from the last program run, just to be extra safe:
theta0=[]; theta1=[];
% There must be some reason not to call theta0_ directly.
if ( x == 1 )
theta0=@theta0_;
theta1=@theta1_;
else
theta0=@otherfunction_;
end
F_(1);
% in F_.m:
function Output = F_(t)
global theta0
global theta1
Output(1)=theta0(t);
end
使用evalin('caller', 'theta0')
内的F_
。
如果您从其他地方致电F_
,可能会导致问题,其中theta0
未宣布或甚至用于其他地方。