2012-04-15 10 views
6

मैं जो अपेक्षा करता हूं उस पर अटक गया हूं जो अपेक्षाकृत सरल अवधारणा होना चाहिए। मैं समझ नहीं पा रहा हूं कि कैसे गतिशील [] कार्यों में वृद्धिशील सूची कुशलता के संबंध में कार्य करता है। निम्नलिखित कथनों पर विचार करें:गणित गतिशील सूची मैनिपुलेशन

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

सरल अधिकार? अब, जब मैं एक्स बदलता हूं तो मैं 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} 

जैसा कि मैं सूची में मानों को बदलता हूं, मुझे लगता है कि संबंधित परिवर्तन बी और सी है; हालांकि, मैं प्रत्येक कथन को भाग पहले तत्व की अपेक्षा करता हूं। गतिशील सूचियों पर कुशलताएं नहीं ले रही हैं।

मेरा प्रश्न है कि हम इस व्यवहार को क्यों देखते हैं, और मैं लगातार गतिशील सूची कुशलता कैसे लागू कर सकता हूं?

अग्रिम धन्यवाद।

उत्तर

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 (:=) आप यह सुनिश्चित करें कि हर बार b और c मूल्यांकन किया जाता है, a के वर्तमान मूल्य प्रयोग किया जाता है बनाने के बजाय मूल्य यह था की तुलना में परिभाषा के बिंदु पर। और Dynamic यह सुनिश्चित करता है कि जब भी a बदल दिया जाए तो प्रदर्शित मूल्य का फिर से मूल्यांकन किया जाता है।

संबंधित मुद्दे