2012-04-15 35 views
6

Tôi bị mắc kẹt với những gì tôi nghĩ là một khái niệm tương đối đơn giản. Tôi không hiểu cách Dynamic [] hoạt động với các thao tác gia tăng danh sách. Xem xét các tuyên bố sau:Mathematica Thao tác danh sách động

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

Đơn giản phải không? Bây giờ, tôi muốn z cập nhật động khi tôi thay đổi x. Đây là nỗ lực của tôi:

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} 

Khi tôi thay đổi giá trị trong danh sách a, tôi thấy thay đổi tương ứng là b và c; tuy nhiên, tôi hy vọng mỗi câu lệnh sẽ có một phần tử đầu tiên là Phần. Thao tác trên danh sách động không được thực hiện.

Câu hỏi của tôi là tại sao chúng ta thấy hành vi này và làm cách nào để áp dụng các thao tác danh sách động liên tiếp?

Cảm ơn bạn trước.

Trả lời

5

Công trình động theo cách khác thường. Xem: Why won't this work? Dynamic in a Select

Bài tập b = Dynamic[First[a]] không đánh giá bất kỳ thứ gì khác ngoài biểu thức chữ Dynamic[First[a]] cho đến khi biểu thức đó hiển thị rõ ràng trên màn hình.

Do đó, khi bạn viết First[b], bạn đang yêu cầu phần đầu tiên của Dynamic[First[a]]First[a].

Thực tế là Dynamic là cách thức hiển thị nhiều hơn một chức năng nội bộ không nên bỏ qua một cách nhẹ nhàng. Việc làm sai lệch chức năng của Dynamic sẽ dẫn đến nhiều sự nhầm lẫn và thất vọng. Tuy nhiên, trong ví dụ đơn giản của bạn, bạn có thể nhận được hành vi mà bạn muốn, ít nhất là trực quan, với điều này:

b = Dynamic[First[a]] 

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

Bạn đánh bại tôi với nó một lần nữa :-) – Heike

+0

@ Giống như tôi nghĩ tôi vừa nhặt mẩu tin lưu niệm. Tôi không biết bạn vẫn đang trả lời các câu hỏi ở đây. :-) –

+1

Tôi thỉnh thoảng kiểm tra khi nó im lặng trên mma.SE – Heike

2

Bạn đã nhận được một câu trả lời tại sao Dynamic không hoạt động như bạn mong đợi, nhưng tôi sẽ thêm làm thế nào để đạt được (tôi nghĩ) những gì bạn muốn:

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 
*) 

Bằng cách sử dụng SetDelayed (:=), bạn hãy chắc chắn rằng mỗi khi bc được đánh giá, giá trị hiện tại của a được sử dụng, chứ không phải là giá trị nó có tại điểm định nghĩa. Và Dynamic đảm bảo rằng giá trị được hiển thị được đánh giá lại bất cứ khi nào a được thay đổi.