4

MATLAB は変数を無名関数と共に格納します。これがドキュメントからどのように機能するかの例を次に示します。

式の変数:

関数ハンドルは、式だけでなく、式の評価に必要な変数も格納できます。

たとえば、係数 a、b、c を必要とする無名関数の関数ハンドルを作成します。

a = 1.3;
b = .2;
c = 30;
parabola = @(x) a*x.^2 + b*x + c;

a、b、および c は放物線の作成時に使用できるため、関数ハンドルにはこれらの値が含まれます。変数をクリアしても、値は関数ハンドル内に保持されます。

clear a b c
x = 1;
y = parabola(x)
y =
   31.5000

おそらく、ab と c の値は、関数が保存され、mat ファイルから再読み込みされた場合でも、関数と共に保存されます。実際には、特に関数を最初に作成したコードが編集された場合、これらの値は保持されないことがわかりました。

変数の数値に関して関数ハンドルを定義する方法はありますか? 私はフォームの何かをしたいです

>> a = 1.3;
>> b = .2;
>> c = 30;
>> parabola = @(x) a*x.^2 + b*x + c

parabola = @(x) a*x.^2+b*x+c

>> parabola2 = forceEval(parabola)

parabola2 = @(x) 1.3*x.^2+.2x+30

編集:おそらく私の問題はファイルの関連付けにありますが、最初に匿名関数を定義したファイルを編集すると、次のようなエラーが表示されます:

関数 @(ydata)nr/(na*dt)*normpdf(ydata,mu(j),s(j))./normpdf(ydata,mu_a(j),s_a(j)) が C: 内に見つかりません。 ..\mファイル名.m. (ここで、mfile の名前を mfilename に変更しました)

この種のものに対する私の通常の解決策は、 func2str() を使用してファイルの依存関係を削除することですが、これにより、パラメーター値を含むワークスペース情報も削除されます。そのため、関数定義ですべてのパラメーターに数値を強制的に適用したいと思います。

4

3 に答える 3

8

値は関数に格納されます。functions以前にさまざまな回答で示したように、次のコマンドでこれを確認できます。

>> a = 1.3; b = .2; c = 30;
>> parabola = @(x) a*x.^2 + b*x + c;
>> x = 1;
>> y = parabola(x)
y =
         31.5
>> clear a b c
>> y = parabola(x)
y =
         31.5
>> fi = functions(parabola)
fi = 
     function: '@(x)a*x.^2+b*x+c'
         type: 'anonymous'
         file: ''
    workspace: {[1x1 struct]}
>> fi.workspace{1}
ans = 
    a: 1.3
    b: 0.2
    c: 30

ハンドルをディスクに保存する場合でも:

>> save parabolaFun.mat parabola
>> clear parabola a b c
>> load parabolaFun.mat parabola
>> y = parabola(x)
y =
         31.5
>> fi = functions(parabola)
fi = 
     function: '@(x)a*x.^2+b*x+c'
         type: 'anonymous'
         file: ''
    workspace: {[1x1 struct]}
>> fi.workspace{1}
ans = 
    a: 1.3
    b: 0.2
    c: 30

そして、次のような放物線ハンドルの作成を簡素化できます。

function p = makeParabola(a,b,c)

p = @(x) a*x.^2 + b*x + c;

end

特定の注意事項があります。

MATLAB® の save 関数と load 関数を使用して、関数ハンドルを MAT ファイルに保存および読み込むことができます。以前の MATLAB セッションで保存した関数ハンドルを読み込むと、次の条件によって予期しない動作が発生する可能性があります。

  • 関数を定義するファイルのいずれかが移動されたため、ハンドルに格納されているパスに存在しなくなりました。
  • 保存された環境とは異なる環境に関数ハンドルをロードします。たとえば、関数のソースが存在しないか、ハンドルが保存されたシステムとは別のフォルダーにあります。

どちらの場合も、関数ハンドルは既存の関数コードに関連付けられていないため、無効になります。ハンドルは無効ですが、MATLAB は正常に読み込みを実行し、警告を表示しません。ただし、ハンドルを呼び出そうとすると、エラーが発生します。

したがって、ファイルに基づく関数 (スクリプトでなくてもかまいません) からハンドルを作成し、ファイルを変更または削除すると、ハンドルは無効になります。

于 2014-11-07T21:06:07.410 に答える
3

無名関数は、式に含まれるすべての変数の値を取得します。キャプチャされた環境ワークスペースを確認したい場合は、 @chappjcfunctionsが彼の回答で示したように使用してください。

ここで、無名関数で使用される変数の型に注意する必要があります (値型とハンドル型を考えてください)。

すべてのネイティブ型(数値、論理、構造体、セルなど) は、参照ではなく値によってキャプチャされます。例:

x = magic(4);
f = @() x;    % captures matrix x

x(1) = 1      % modify x
xx = f()      % change not reflected here

それをハンドルクラス型を使用する場合と比較してください(例: containers.Map):

x = containers.Map('KeyType','char', 'ValueType','double');
f = @() x;        % captures handle-class object x

x('1') = 1;       % modify map
keys(x)           % changed
keys(f())         % also changed!

f() == x          % compare handle equality, evaluates to true
于 2014-11-07T22:24:39.357 に答える
1
a = 1.3, b = 0.2, c = 30;
parabola = eval(['@(x) ', num2str(a), '*x^2 + ', num2str(b), '*x + ', num2str(c)]);
于 2014-11-07T19:49:19.513 に答える