2012-04-15 18 views
6

私は比較的単純な概念でなければならないと思うことに固執しています。動的な[]関数がインクリメンタルリストの操作に関してどのように機能するのか理解していません。以下のステートメントを考えてみましょう。Mathematica動的リスト操作

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

シンプルな権利ですか?今、xを変更するとzが動的に更新されます。ここに私の試みがあります:

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です。しかし、私はそれぞれの文がPartの最初の要素になると期待します。動的リストの操作は行われません。

私の質問は、この現象がなぜ発生するのか、連続した動的リスト操作をどのように適用できるのかです。

ありがとうございます。

答えて

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

+0

@ヘイケ私はちょうどスクラップをピックアップしていると思った。私はまだあなたがここで質問に答えているのを知らなかった。 :-) –

+1

mma.SEで静かな時に時折チェックインする – Heike

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が変更されるたびに表示された値が再評価されるようにします。