2010-05-06 66 views
7

Tôi đã cố gắng kết hợp một cái gì đó cho phép tôi trích xuất các điểm từ một ListPlot để sử dụng chúng trong các tính toán tiếp theo. Cách tiếp cận hiện tại của tôi là chọn các điểm với một Locator []. Điều này làm việc tốt cho việc hiển thị các điểm, nhưng tôi không thể tìm ra cách để trích xuất các giá trị số từ một cấu trúc có phần tử Dynamic []. Dưới đây là một ví dụ khép kín. Bằng cách kéo bộ định vị màu xám, bạn sẽ có thể chọn các điểm (được chỉ định bởi bộ định vị màu hồng và được lưu trữ trong q, một danh sách gồm hai phần tử). Đây là dòng thứ hai bên dưới cốt truyện. Bây giờ tôi muốn chuyển q [[2]] cho một hàm, hoặc có lẽ chỉ đơn giản là hiển thị nó. Tuy nhiên, Mathematica xử lý q là một thực thể duy nhất với đầu Dynamic và do đó việc lấy phần thứ hai là không thể (do đó là thông báo lỗi). Bất cứ ai có thể làm sáng tỏ làm thế nào để chuyển đổi q vào một danh sách thường xuyên?Chuyển đổi cấu trúc Động [] thành danh sách số

EuclideanDistanceMod[p1_List, p2_List, fac_: {1, 1}] /; 
    Length[p1] == Length[p2] := 
    Plus @@ (fac.MapThread[Abs[#1 - #2]^2 &, {p1, p2}]) // Sqrt; 
test1 = {{1.`, 6.340196001221532`}, {1.`, 
    13.78779876355869`}, {1.045`, 6.2634018978377295`}, {1.045`, 
    13.754947081416544`}, {1.09`, 6.178367702583522`}, {1.09`, 
    13.72055251752498`}, {1.135`, 1.8183153704413153`}, {1.135`, 
    6.082497198000075`}, {1.135`, 13.684582525399742`}, {1.18`, 
    1.6809452373465104`}, {1.18`, 5.971583107298081`}, {1.18`, 
    13.646996905469383`}, {1.225`, 1.9480537697339537`}, {1.225`, 
    5.838386922625636`}, {1.225`, 13.607746407088161`}, {1.27`, 
    2.1183174369679234`}, {1.27`, 5.669799095595362`}, {1.27`, 
    13.566771130126131`}, {1.315`, 2.2572975468163463`}, {1.315`, 
    5.444014254828522`}, {1.315`, 13.523998701347882`}, {1.36`, 
    2.380307009155079`}, {1.36`, 5.153024664297602`}, {1.36`, 
    13.479342200528283`}, {1.405`, 2.4941312539733285`}, {1.405`, 
    4.861423833512566`}, {1.405`, 13.432697814928654`}, {1.45`, 
    2.6028066447609426`}, {1.45`, 4.619367407525507`}, {1.45`, 
    13.383942212133244`}}; 
DynamicModule[{p = {1.2, 10}, q = {1.3, 11}}, 
q := [email protected] 
    [email protected][[ 
    Ordering[{#, EuclideanDistanceMod[p, #, {1, .1}]} & /@ test1, 
     1, #1[[2]] < #2[[2]] &]]]; 
Grid[{{Show[{ListPlot[test1, Frame -> True, ImageSize -> 300], 
     [email protected][Dynamic[p]], 
     [email protected] 
     Locator[q, Appearance -> {Small}, 
     Background -> Pink]}]}, {[email protected]}, {q},{q[[2]]}}]] 
+0

+1: Tôi hoàn toàn bối rối. 'Dynamic' không xuất hiện như thể nó có thể được gỡ bỏ. Tôi đã xem q dưới 'FullForm' và không có gì để lấy; các bên trong vẫn chưa được đánh giá trước khi nó được hiển thị. Tôi đã thử đặt 'x = q', nhưng' Dynamic' đã được chuyển vì vấn đề hiển thị. – rcollyer

Trả lời

2

Sau một chút nghiên cứu nhiều hơn, dường như câu trả lời xoay quanh sự kiện Dynamic [] là một trình bao bọc để cập nhật và hiển thị biểu thức. Bất kỳ tính toán nào bạn muốn tự động cập nhật phải được đặt bên trong trình bao bọc: ví dụ: thay vì làm một cái gì đó như q = Dynamic[p] + 1, hãy sử dụng một cái gì đó như Dynamic[q = p + 1; q]}]. Ví dụ của tôi, nơi tôi muốn chia q thành hai phần, đây là mã Cập nhật:

DynamicModule[{p = {1.2, 10}, q = {1.3, 11}, qq, q1, q2}, 
q := Dynamic[ 
    qq = [email protected] 
    test1[[Ordering[{#, EuclideanDistanceMod[p, #, {1, .1}]} & /@ 
     test1, 1, #1[[2]] < #2[[2]] &]]]; 
    {q1, q2} = qq; 
    qq 
    ]; 
Grid[{{Show[{ListPlot[test1, Frame -> True, ImageSize -> 300], 
     [email protected][Dynamic[p]], 
     [email protected] 
     Locator[q, Appearance -> {Small}, 
     Background -> Pink]}]}, {[email protected]}, {[email protected]}, {[email protected] 
    q1}}]] 

Nếu tôi vẫn còn thiếu một cái gì đó, hoặc nếu có một cách sạch hơn để làm điều này, tôi hoan nghênh bất kỳ lời đề nghị ...

5

Có một số cách để trích xuất các giá trị từ biểu thức động. Những gì bạn có thể muốn là Setting (documentation), giải quyết tất cả giá trị động vào giá trị của chúng tại thời điểm Setting được đánh giá.

In[75]:= Slider[Dynamic[x]] (* evaluate then move the slider *) 

In[76]:= FullForm[Dynamic[x]] 
Out[76]//FullForm= Dynamic[x] 

In[77]:= FullForm[Setting[Dynamic[x]]] 
Out[77]//FullForm= 0.384` 

Dưới đây là một ví dụ hơi phức tạp hơn:

DynamicModule[{x}, 
    {Dynamic[x], Slider[Dynamic[x]], 
    Button["Set y to the current value of x", y = Setting[Dynamic[x]]]} 
] 

Nếu bạn đánh giá biểu thức trên, di chuyển thanh trượt và sau đó nhấn nút, giá trị hiện tại của x như thiết lập bởi các thanh trượt được gán cho y. Nếu bạn sau đó di chuyển thanh trượt một lần nữa, giá trị của y không thay đổi cho đến khi bạn cập nhật lại bằng cách nhấp vào nút.

Thay vì gán cho một biến, bạn có thể tất nhiên giá trị dán vào máy tính xách tay, gọi một chức năng, xuất khẩu một tập tin, vv

Các vấn đề liên quan