5

それで、私は最近 Mathematica から Matlab に変換しました。Matlab は Mathematica の便利な機能のほとんどを備えていますが、Mathematica の遅延集合操作「:=」に相当するものを実行する方法がわかりません。怠惰なファッション。

たとえば、Mathematica では次のようになります。

y = 2;

x := y;

y = 3;

バツ

x の値は 3 になりますが、Matlab でこれと同じ動作を得る唯一の方法は次のとおりです。

y = 2;

x = @()(y);

y = 3;

バツ()

技術的には私の質問に答えていますが、これは非常にアドホックな回避策であり、x を関数として扱う必要があります。

これを行うためのより自然な方法はMatlabですか?

編集:

私のアドホック ソリューションは、y がハンドル クラスのフィールドである場合にのみ機能します。わかりやすくするために、これをコードから除外しました (someclass.y にする必要があります)。私の質問への回答にはこの制限がないことが望ましいですが、制限がある場合でも受け入れます。

4

2 に答える 2

5

遅延評価は主に関数型プログラミング言語で使用され、MATLABは手続き型/OOPベースです。そのため、同等のSetDelayedものは存在しません。実証したように無名関数を使おうとすると、Amroがすでに指摘しているように、機能しません。

ただし、記号計算ツールボックスにアクセスできる場合は、:=(私に言わせれば、薄っぺらな同等物)と同等と見なすことができるものでうまくいくことができます。次に例を示します。

syms x y z; %#Declare x, y and z as symbolic variables
x=y+2; %#Define some value for x
f=@(x)x.^2; %#Define an anonymous function. 

f(x)

ans =

(y + 2)^2

%#Check with z
f(z)

ans =

z^2   

の実際の定義を使用しており、数値例のようにfの定義をキャプチャしていないことがわかります。xの定義を変更してxx=1/y現在f(x)のの定義を使用することもできxます。これfは単なる関数ハンドルであり、数値/記号の引数を取ることに注意してください。例えば、

f(1:5)

ans =

     1     4     9    16    25

似ていない部分は、式に存在する用語にのみ:=定義を適用し、深くはならないことです(つまり、最初の結果として生じる可能性のあるさまざまな変数のセットの定義を評価しません評価)。MATLABはルールベースの言語ではないため、これは驚くことではありません。私のポイントを説明するために:

y=z^3; %#Define y
f(x)

ans = 
(y + 2)^2 %#The definition for y is not used.

一方、Mathematicaはあなたに与えたでしょう(z^3+2)^2

Clear[y, z, x, f]
f[x_] := x^2;
y := z^3; x := y + 2;

f[x]

Out[1]= (2 + z^3)^2

2つの言語の違いを受け入れ、それぞれの慣用句に固執しようとした場合に最適です。それを否定し、他のプログラムと同じようにプログラムしようとすると、あなたの人生が悲惨になる可能性があります(たとえば、Cの背景から始めて、ForMathematicaでループを断固として書く)。

于 2011-07-29T22:30:20.203 に答える
3

実際、提案されたソリューションは期待どおりに機能しません。

y = 2;
x = @()(y);
y = 3;
x()

匿名関数を定義すると、クロージャが作成yされ、その時点での値がキャプチャ/コピーされます(現在は独自のコピーがありますy)。次にy、外側を変更しても、クロージャーで作成されたものには影響しません。したがって、この例では、最後の値23

私が考えることができる唯一の方法は、変数をクロージャにカプセル化し、set / getメソッドを公開することです(OOPの場合と同様)。

IMO、MATLAB、Mathematicaには2つの非常に異なる言語があるので、MATLABの方法を採用し、他の言語の機能をエミュレートしようとはしません(通常はこれが最善の方法ではありません)

于 2011-07-29T21:37:35.530 に答える