2010-05-06 6 views
7

나는 ListPlot에서 포인트를 추출하여 더 많은 계산에 사용할 수있는 무언가를 모으려고 노력해 왔습니다. 나의 현재 접근 방식은 Locator []로 포인트를 선택하는 것이다. 이 점을 표시하려면 잘 작동하지만 머리 동적 [] 함께 구조에서 숫자 값을 추출하는 방법을 알아낼 수 없습니다. 다음은 자체 포함 된 예입니다. 회색 로케이터를 끌어서 점을 선택할 수 있어야합니다 (핑크 로케이터로 표시되고 q에 저장 됨, 두 요소 목록). 이것은 플롯 아래의 두 번째 줄입니다. 이제 q [[2]]를 함수에 전달하거나 간단히 표시하고 싶습니다. 그러나 Mathematica는 q을 머리 Dynamic이있는 단일 엔티티로 취급하므로 두 번째 부분을 차지하는 것이 불가능합니다 (따라서 오류 메시지). 누구든지 q을 정규리스트로 변환하는 방법에 관한 정보를 얻을 수 있습니까?Dynamic [] 구조체를 숫자 목록으로 변환

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 : 완전히 뒤죽박죽입니다. '동적'은 제거 할 수있는 것처럼 보이지 않습니다. 나는 FullForm에서 q를 보았고 잡을 것이 없다. 내부가 표시 될 때까지 평가되지 않은 상태로 유지됩니다. 나는'x = q'를 설정하려했지만 디스플레이 문제로 인해 '동적'이 전송되었습니다. – rcollyer

답변

2

을 함수를 호출 그 Dynamic []은 표현을 업데이트하고 표시하는 래퍼입니다. 동적으로 업데이트하려는 계산은 래퍼에 배치해야합니다. 예를 들어 q = Dynamic[p] + 1과 같은 것을 수행하는 대신 Dynamic[q = p + 1; q]}]과 같은 것을 사용해야합니다. 난 아직도 뭔가를 놓친 경우

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}}]] 

, 또는이 할 수있는 청소기 방법이 있다면, 나는 어떤 제안을 환영합니다 ... : 나는 두 부분으로 q을 분할하고 싶었 내 예를 들어, 여기에 업데이트 된 코드입니다

5

동적 표현식에서 값을 추출하는 방법에는 여러 가지가 있습니다. 원하는 값은 Setting (documentation)입니다. Setting이 평가 될 때 모든 동적 값이 해당 값으로 분석됩니다.

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

위의 식을 계산할 경우, 슬라이더를 이동 한 후 버튼을 클릭, 슬라이더에 의해 설정된 x의 현재 값이 할당 :

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` 

여기에 조금 더 복잡한 예제 y. 그런 다음 슬라이더를 다시 움직이면 y 값은 단추를 클릭하여 다시 업데이트 할 때까지 변경되지 않습니다. 대신 변수에 할당

, 당신은 노트북에 코스 붙여 넣기 값의 수, 그 대답은 사실 중심으로 돌아가 나타납니다, 좀 더 연구 한 후 등, 파일을 내보낼

관련 문제