2010-05-06 16 views
7

Ho cercato di mettere insieme qualcosa che mi permetta di estrarre punti da un ListPlot per usarli in ulteriori calcoli. Il mio attuale approccio è selezionare punti con un localizzatore []. Funziona bene per la visualizzazione dei punti, ma non riesco a capire come estrarre valori numerici da un costrutto con la testa Dinamica []. Di seguito è riportato un esempio autonomo. Trascinando il localizzatore grigio, dovresti essere in grado di selezionare i punti (indicati dal localizzatore rosa e memorizzati in q, un elenco di due elementi). Questa è la seconda riga sotto la trama. Ora vorrei passare q [[2]] a una funzione, o forse semplicemente visualizzarla. Tuttavia, Mathematica considera q come una singola entità con la testa Dynamic, e quindi la seconda parte è impossibile (da qui il messaggio di errore). Qualcuno può far luce su come convertire q in un elenco normale?Convertire un costrutto dinamico [] in un elenco numerico

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: Sono completamente perplesso. 'Dynamic' non appare come se potesse essere rimosso. Ho visto q sotto 'FullForm' e non c'è nulla da afferrare; gli interni rimangono non valutati fino a quando non viene visualizzato. Ho provato a impostare 'x = q', ma' Dynamic' è stato trasferito a causa del problema di visualizzazione. – rcollyer

risposta

2

Dopo un po 'più di ricerca, sembra che la risposta ruota intorno al fatto that Dynamic [] è un wrapper per l'aggiornamento e la visualizzazione dell'espressione. Tutti i calcoli che vuoi aggiornare dinamicamente devono essere collocati all'interno del wrapper: ad esempio, invece di fare qualcosa come q = Dynamic[p] + 1 si dovrebbe usare qualcosa come Dynamic[q = p + 1; q]}]. Per il mio esempio, dove volevo dividere q in due parti, ecco il codice aggiornato:

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

Se sto ancora manca qualcosa, o se c'è un modo più pulito per fare questo, accolgo con favore qualsiasi suggerimento ...

5

Esistono diversi modi per estrarre i valori da un'espressione dinamica. Quello che probabilmente si desidera è Setting (documentation), che risolve tutti i valori dinamici nei loro valori nel momento in cui viene valutato Setting.

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` 

Ecco un esempio un po 'più complicato:

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

Se si valuta l'espressione di cui sopra, spostare il cursore e fare clic sul pulsante, il valore corrente di x come stabilito dal cursore viene assegnato a y. Se si sposta nuovamente il cursore, il valore di non cambia fino a quando non lo si aggiorna nuovamente facendo clic sul pulsante.

Invece di assegnare a una variabile, è possibile di valori incollare corso nel notebook, chiamare una funzione, esportare un file, ecc

Problemi correlati