0

我在 Matlab 的 3 个单独的 m 文件中编写了 3 个简短的函数。

主函数称为 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_;

当我通过任何值的句柄运行 F_ 时,t我收到以下错误:

F_(1)
Undefined function 'theta0' for input arguments of type 'double'.

Error in F_ (line 9)
Output(1) = theta0(t);

请协助。我在这里做错了什么?

我只想能够从另一个函数中调用一个函数。

4

1 回答 1

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没有声明甚至用于不同的东西。

于 2013-08-31T19:36:59.277 回答