0

Matlab の 3 つの個別の m ファイル内に記述した 3 つの短い関数があります。

メイン関数は F_ と呼ばれ、1 つの入力引数を受け入れ、3 つの要素を持つベクトルを返します。

F_ からの出力の要素 1 と 2 は、他の 2 m ファイルの関数を使用して計算されます (想定されます)。

コードは次のとおりです。

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 に答える