代码之家  ›  专栏  ›  技术社区  ›  Leo Alekseyev

将动态[]构造转换为数字列表

  •  7
  • Leo Alekseyev  · 技术社区  · 16 年前

    我一直在尝试把一些东西放在一起,使我能够从列表图中提取点,以便在进一步的计算中使用它们。我目前的方法是使用定位器[]选择点。这可以很好地显示点,但我不知道如何从具有head dynamic[]的构造中提取数值。下面是一个独立的示例。通过拖动灰色定位器,您应该能够选择点(由粉色定位器指示并存储在 q ,两个元素的列表)。这是图下面的第二行。现在我想把q[[2]]传递给一个函数,或者仅仅显示它。然而,Mathematica对待 Q 作为一个单独的实体 Dynamic ,因此无法执行第二部分(因此出现错误消息)。有谁能解释一下如何转变 Q 列入常规名单?

    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 := Dynamic@
       First@test1[[
         Ordering[{#, EuclideanDistanceMod[p, #, {1, .1}]} & /@ test1, 
          1, #1[[2]] < #2[[2]] &]]];
     Grid[{{Show[{ListPlot[test1, Frame -> True, ImageSize -> 300], 
          Graphics@Locator[Dynamic[p]], 
          Graphics@
           Locator[q, Appearance -> {Small}, 
            Background -> Pink]}]}, {Dynamic@p}, {q},{q[[2]]}}]]
    
    2 回复  |  直到 16 年前
        1
  •  5
  •   Michael Pilat    16 年前

    有几种方法可以从动态表达式中提取值。你可能想要的是 Setting (documentation) ,它将所有动态值解析为它们当时的值。 设置 被评估。

    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`
    

    下面是一个稍微复杂一点的例子:

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

    如果对上述表达式求值,请移动滑块,然后单击按钮,当前值为 x 如滑块所设置 y . 如果再次移动滑块,则 Y 只有通过单击按钮再次更新时才会更改。

    当然,您可以将值粘贴到笔记本、调用函数、导出文件等,而不是指定给变量。

        2
  •  2
  •   Leo Alekseyev    16 年前

    在进一步研究之后,答案似乎围绕着这样一个事实:dynamic[]是用于更新和显示表达式的包装器。任何需要动态更新的计算都必须放在包装器中:例如,而不是像 q = Dynamic[p] + 1 一个人应该使用像 Dynamic[q = p + 1; q]}] . 以我为例,我想分开 q 分为两部分,以下是更新后的代码:

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

    如果我仍然遗漏了什么,或者有一个更干净的方法来做,我欢迎任何建议…