2012-04-15 103 views
6

我堅持我認爲應該是一個相對簡單的概念。我不瞭解Dynamic []如何處理增量列表操作。考慮以下陳述:Mathematica動態列表操作

In[459]:= x={{1,2}}; 
In[462]:= y=First[x] 
Out[462]= {1,2} 
In[463]:= z=First[y] 
Out[463]= 1 

簡單的權利?現在,我希望z在更改x時動態更新。這是我的嘗試:

In[458]:= a={{1,2}}; 
In[452]:= b=Dynamic[First[a]] 
Out[452]= {1,2} 
In[449]:= c=Dynamic[First[b]] 
Out[449]= {1,2} 

當我更改列表a中的值時,我看到相應的變化是b和c;然而,我期望每一個陳述第一個元素。動態列表上的操作沒有采取。

我的問題是爲什麼我們會看到這種行爲,以及如何應用連續的動態列表操作?

預先感謝您。

回答

5

動態以不尋常的方式工作。請參閱:Why won't this work? Dynamic in a Select

作業b = Dynamic[First[a]]不計算除字面表達式Dynamic[First[a]]之外的任何其他值,直到該表達式要在屏幕上可見地顯示爲止。

因此,當你寫First[b]你要求的第一部分Dynamic[First[a]]這是First[a]

Dynamic比內部功能更具有顯示技巧的事實不應該被忽視。錯誤Dynamic的功能將導致許多混亂和沮喪。然而,在你的簡單的例子,你可以得到你想要的行爲,至少在視覺上,與此:

b = Dynamic[First[a]] 

c = Dynamic[[email protected][b]] 
+0

你再次擊敗我:-) – Heike 2012-04-15 08:32:35

+0

@很喜歡我以爲我只是撿起垃圾。我不知道你還在這裏回答問題。 :-) – 2012-04-15 08:35:38

+1

我偶爾會在mma.SE上安靜時檢查 – Heike 2012-04-15 08:45:22

2

你已經得到了一個答案,爲什麼Dynamic您預期的那樣是不行的,但我會添加如何實現什麼(我覺得)你想:

a={{1,2}} 
(* 
==> {{1,2}} 
*) 

b:=First[a];Dynamic[b] 
(* 
==> {1,2} 
*) 

c:=First[b];Dynamic[c] 
(* 
==> 1 
*) 

a={{3,4}} 
(* 
==> {{3,4}} 
-- The displays for b and c now change to {3,4} and 3 
*) 

通過使用SetDelayed:=)您確保每一個bc進行評估時,使用的a當前值,而不是它有值在定義的時候。 Dynamic確保在更改a時重新評估顯示的值。