Lazy evaluation主要用於函數式編程語言和MATLAB i基於程序/ OOP的。因此,不存在相當於SetDelayed
。正如你已經證明的那樣,如果你嘗試使用匿名函數,它將無法工作,正如Amro已經指出的那樣。然而,如果你有權訪問符號計算工具箱,那麼你可以通過一些可以被認爲相當於:=
的東西(如果你問我的話,這是一種脆弱的等價)。這裏有一個例子:
syms x y z; %#Declare x, y and z as symbolic variables
x=y+2; %#Define some value for x
[email protected](x)x.^2; %#Define an anonymous function.
f(x)
ans =
(y + 2)^2
%#Check with z
f(z)
ans =
z^2
你可以看到它使用的f
實際定義,並沒有捕捉x
的定義,因爲它在你的算例一樣。您還可以更改x
的定義,即x=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
這是最好的,如果你接受兩種語言的差異,並試圖堅持的是在每個成語。試圖否認它並像其他程序一樣可能會讓你的生活變得悲慘(例如,從C背景開始,堅持在Mathematica中寫入For
循環)。
感謝您的支持,我編輯了我的帖子以解釋它。然而,這應該真的是對我的問題的評論,而不是一個答案,因爲你還沒有試圖提供一個答案... 此外,雖然我意識到Mathematica和Matlab原本是非常不同的語言(符號與數值計算),他們已經開始以不平凡的方式重疊。兩者都允許在各種範例中進行編程,所以實際上不再有一種「MATLAB方式」。 – zergylord
@zergylord:真相是我作爲一個評論開始的,但對於一個人來說太長了。我會刪除它,如果你覺得這不會增加任何價值:( – Amro
啊,是的,邪惡的字符限制.NVM然後,你不應該刪除它,因爲它是信息性的:)。 – zergylord