【问题标题】:Mathematica Dynamic List ManipulationMathematica 动态列表操作
【发布时间】:2012-04-26 22:22:14
【问题描述】:

我坚持认为应该是一个相对简单的概念。我不了解 Dynamic[] 与增量列表操作有关的功能。考虑以下语句:

In[459]:= x={{1,2}};
In[462]:= y=First[x]
Out[462]= {1,2}
In[463]:= z=First[y]
Out[463]= 1

简单吧?现在,我希望 z 在我更改 x 时动态更新。这是我的尝试:

In[458]:= a={{1,2}};
In[452]:= b=Dynamic[First[a]]
Out[452]= {1,2}
In[449]:= c=Dynamic[First[b]]
Out[449]= {1,2}

当我更改列表 a 中的值时,我看到相应的更改是 b 和 c;但是,我希望每个语句都 Part 第一个元素。不会对动态列表进行操作。

我的问题是为什么我们会看到这种行为,以及如何应用连续的动态列表操作?

提前谢谢你。

【问题讨论】:

    标签: dynamic wolfram-mathematica


    【解决方案1】:

    您已经得到了为什么Dynamic 无法按预期工作的答案,但我将添加如何实现(我认为)您想要的:

    a={{1,2}}
    (*
    ==> {{1,2}}
    *)
    
    b:=First[a];Dynamic[b]
    (*
    ==> {1,2}
    *)
    
    c:=First[b];Dynamic[c]
    (*
    ==> 1
    *)
    
    a={{3,4}}
    (*
    ==> {{3,4}}
    -- The displays for b and c now change to {3,4} and 3
    *)
    

    通过使用SetDelayed (:=),您可以确保每次评估bc 时,都会使用a 的当前值,而不是它在定义时的值. Dynamic 确保在 a 更改时重新评估显示的值。

    【讨论】:

      【解决方案2】:

      Dynamic 以不同寻常的方式工作。见:Why won't this work? Dynamic in a Select

      赋值b = Dynamic[First[a]] 不会计算出除文字表达式Dynamic[First[a]] 之外的任何值,直到该表达式被明显地显示在屏幕上。

      因此,当您编写First[b] 时,您要求的是Dynamic[First[a]] 的第一部分,即First[a]

      Dynamic 在某种程度上更像是一种展示技巧而不是内部功能,这一事实不容忽视。误用Dynamic 的功能会导致很多混乱和挫败感。不过,在您的简单示例中,您至少可以通过以下方式获得您想要的行为:

      b = Dynamic[First[a]]
      
      c = Dynamic[First@First[b]]
      

      【讨论】:

      • @Heike 我以为我只是在捡垃圾。我不知道你还在这里回答问题。 :-)
      • 我偶尔会在 mma.SE 安静时签到
      猜你喜欢
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多