5

所以,我最近從Mathematica轉換到Matlab,雖然Matlab具有大部分Mathematica的有用功能,但我無法弄清楚如何執行Mathematica的延遲設置操作':='的等價操作,該操作爲變量賦值以懶惰的方式。您可以在Matlab中執行延遲集(:=在Mathematica中)嗎?

例如,在數學:

Y = 2;

x:= y;

y = 3;

X

會給x的值爲3時,而我可以得到在Matlab此相同的行爲的唯一方法是:

Y = 2;

x = @()(y);

y = 3;

X()

其中,雖然在技術上回答我的問題,是圍繞一個漂亮的專案工作,並需要治療x作爲一個功能。

那麼有沒有更自然的方式來做到這一點是Matlab?

編輯:

我即席解決方案,只有當y是一個手柄類的現場工作,我離開了這一點,爲了清晰的代碼(這應該是someclass.y)。最好對我的問題的答案不會有這個限制,但如果確實如此,我仍然會接受。

回答

5

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/yf(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循環)。

3

其實按照預期的建議的解決方案不起作用:

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

當你定義匿名函數,它創建一個封閉和捕獲/份y在那一刻值(現在它有它自己的y的副本)。然後,如果你在外面改變y,它不會影響在封閉創建的,因此在你的榜樣的最後一個值將返回23

我能想到的唯一的辦法就是封裝變量關閉和暴露set/get方法(就像在OOP中一樣)

IMO,MATLAB和Mathematica有兩種截然不同的語言,因此我會採用MATLAB方式,而不是嘗試模擬其他語言的功能(通常不會最好的辦法)

+0

感謝您的支持,我編輯了我的帖子以解釋它。然而,這應該真的是對我的問題的評論,而不是一個答案,因爲你還沒有試圖提供一個答案... 此外,雖然我意識到Mathematica和Matlab原本是非常不同的語言(符號與數值計算),他們已經開始以不平凡的方式重疊。兩者都允許在各種範例中進行編程,所以實際上不再有一種「MATLAB方式」。 – zergylord

+0

@zergylord:真相是我作爲一個評論開始的,但對於一個人來說太長了。我會刪除它,如果你覺得這不會增加任何價值:( – Amro

+0

啊,是的,邪惡的字符限制.NVM然後,你不應該刪除它,因爲它是信息性的:)。 – zergylord