2010-05-06 13 views
7

He intentado juntar algo que me permite extraer puntos de un ListPlot para usarlos en otros cálculos. Mi enfoque actual es seleccionar puntos con un localizador []. Esto funciona bien para mostrar puntos, pero no puedo entender cómo extraer valores numéricos de un constructo con cabezal dinámico []. A continuación se muestra un ejemplo autónomo. Al arrastrar el localizador gris, debe poder seleccionar puntos (indicados por el localizador rosa y almacenados en q, una lista de dos elementos). Esta es la segunda línea debajo de la trama. Ahora me gustaría pasar q [[2]] a una función, o simplemente mostrarla. Sin embargo, Mathematica trata q como una sola entidad con la cabeza Dynamic, y por lo tanto tomar la segunda parte es imposible (de ahí el mensaje de error). ¿Alguien puede arrojar luz sobre cómo convertir q en una lista normal?Convierta una construcción dinámica [] a una lista numérica

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: Estoy completamente perplejo. 'Dynamic' no aparece como si se pudiera eliminar. Miré q bajo 'FullForm' y no hay nada que agarrar; las partes internas permanecen sin evaluar hasta que se muestra. Intenté configurar 'x = q', pero' Dynamic' se transfirió debido al problema de visualización. – rcollyer

Respuesta

2

Después de investigar un poco más, parece que la respuesta gira en torno al hecho de que Dynamic [] es un contenedor para actualizar y mostrar la expresión. Cualquier cómputo que desee actualizar dinámicamente debe colocarse dentro del contenedor: por ejemplo, en lugar de hacer algo como q = Dynamic[p] + 1, debe usar algo como Dynamic[q = p + 1; q]}]. Para mi ejemplo, en lo que quería dividir q en dos partes, aquí está el código de actualización:

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

Si todavía estoy perdiendo algo, o si hay una forma más limpia de hacer esto, doy la bienvenida a cualquier sugerencia ...

5

Existen varias formas de extraer valores de una expresión dinámica. Lo que probablemente desee es Setting (documentation), que resuelve todos los valores dinámicos en sus valores en el momento en que se evalúa 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` 

Aquí está un ejemplo un poco más complicado:

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

Si se evalúa la expresión anterior, mueva el control deslizante y haga clic en el botón, se le asigna el valor actual de x según lo establecido por el regulador para y. Si luego mueve el control deslizante de nuevo, el valor de y no cambia hasta que lo actualice de nuevo haciendo clic en el botón.

En lugar de asignar a una variable, se puede pegar valores de los cursos en el bloc de notas, llamar a una función, exportar un archivo, etc.

Cuestiones relacionadas