gpt4 book ai didi

wolfram-mathematica - 如何定义部分 Manipulate 控制变量定义以减少代码重复

转载 作者:行者123 更新时间:2023-12-04 00:48:11 25 4
gpt4 key购买 nike

这与这个问题有点相关

Define control as variable in Mathematica

但是上面的问题并没有回答我的问题,因为它谈到了完整的控制定义。 (我也尝试了那里展示的一些技巧,但它们对我的问题不起作用)。

我现在只询问部分控件的定义。 (用这种论坛形式跟进一个老问题也很困难。因为使用小评论区,很难问和显示更像是在空间较大的地方提出新问题时,可以粘贴代码和图片)。

我所做的所有尝试都不起作用。我将从简单的例子开始解释这个问题。

假设一个人想写

Clear["Global`*"];

Manipulate[Plot[f*g, {x, -1, 1}],
Grid[{
{Style["f(x)="],
PopupMenu[Dynamic[f], {x, x^2, x^3}, ImageSize -> Tiny]},{Style["g(x)="],
PopupMenu[Dynamic[g], {x, x^2, x^3}, ImageSize -> Tiny]}
}]
]

您可以看到每个控件定义中都有很多重复的代码。 (像 ImageSize、Spacings-> 和许多其他装饰设置,对于每个控件都会一遍又一遍地重复。

enter image description here

什么会很棒,如果我能写出类似的东西
Manipulate[Plot[f*g, {x, -1, 1}],
Grid[{
{Style["f(x)="], PopupMenu[Dynamic[f], Evaluate@Sequence@v]},
{Style["g(x)="], PopupMenu[Dynamic[g], Evaluate@Sequence@v]}
}],

Initialization :>
(
v = {{x, x^2, x^3}, ImageSize -> Tiny}
)
]

但这不起作用。我沿着上述路线尝试了许多其他事情,但没有任何效果。像
{Style["f(x)="], PopupMenu[Dynamic[f], v]},


{Style["f(x)="], PopupMenu[Dynamic[f], Evaluate@v]}


Manipulate[Plot[f*g, {x, -1, 1}],

{{v, {{x, x^2, x^3}, ImageSize -> Tiny}}, None},
Grid[{
{Style["f(x)="], PopupMenu[Dynamic[f], Evaluate@v]},
{Style["g(x)="], PopupMenu[Dynamic[g], v]}
}]
]

无法让它工作。

但这里是游戏规则:这将是一个演示,因此, 代码必须以 Manipulate 开头.不能在 Manipulate 之外有 Module。另外, 不能使用 Hold 和它的 friend .但可以使用未评估。

我希望这里的专家可能有一个技巧来做到这一点。如果可以的话,将减少代码大小,因为我拥有的许多控件都包含许多与上述相同的“选项”,并且能够执行上述操作将使代码更易于阅读和管理.

谢谢,

附言。我所要求的有点类似于说 Plot 选项所做的事情,其中​​可以使用 SetOptions 设置一些常见的默认选项,这样他们就不必每次都为每个 Plot 命令复制它们。但是在这种情况下没有这样的事情。

更新

使用下面 Leonid 显示的方法(宏技巧),我想用它来帮助我定义控件的数量,所有这些都使用一个通用设置。这是我尝试过的:
Manipulate[{x, y},

Evaluate@With[
{
control1 = Function[{var, initialValue, str, from, to, incr},
{
{{var, initialValue, str}, from, to, incr, ImageSize -> Tiny}
}
,
HoldAll
]
},

{
First@control1[x, 0, "x=", 0, 1, .1],
First@control1[y, 0, "y=", 0, 2, .1],
First@control1[z, 0, "z=", 0, 10, .1]
},

]
]

问题只是整个事情的额外{},否则它会起作用。会继续努力解决这个问题。但是越来越近了。试过 Sequence[] 和 Flatten[..,1] 等,但还做不到。煮更多的咖啡,应该会有所帮助。

更新 2

下面是一个使用 Simon 方法的示例,用于帮助定义多个控件的通用定义。这样,可以使用它来减少一组单独控件上的常用选项的代码重复

注意,必须使用 Control[]让它控制。
Manipulate[{x, y, z},

Dynamic[Grid[{
{control1[x, 0, "x=", 0, 1, .1]},
{control1[y, 0, "y=", 0, 2, .1]},
{control1[z, 0, "z=", 0, 10, .1]}
}]],

{{control1,
Function[{var, initialValue, str, from, to, incr},
Control[{{var, initialValue, str}, from, to, incr,
ImageSize -> Tiny}], HoldFirst]}, None}

]

enter image description here

更新 3

并让 Leonid 方法也适用于多个控件。诀窍是使用 Control[] .不能使用普通的旧 {{x,0,"x"},...} [编辑,是的,你可以,只需要 Leonid 更新如下所示的 Sequence@@ 方法。]。

这里是:
Manipulate[{x, y, z},

Evaluate@With[
{
control1 = Function[{var, initialValue, str, from, to, incr},
Control[{{var, initialValue, str}, from, to, incr,
ImageSize -> Tiny}]
, HoldAll
]
},

Grid[{
{control1[x, 0, "x=", 0, 1, .1]},
{control1[y, 0, "y=", 0, 2, .1]},
{control1[z, 0, "z=", 0, 10, .1]}
}]

]
]

enter image description here

我将尝试将其中一种方法集成到我的主要演示中(到目前为止,仅用于控件布局的代码已超过 600 行,并且还在不断增长,希望这些方法能将其缩小很多)

2011 年 9 月 26 日更新。晚上 7 点

我想我通过使用“宏”定义包含许多常见样板代码的控件来发布代码保存的“鸟瞰” View 。这是之前和之后的屏幕截图。

再次感谢所有的回答和帮助。

enter image description here

最佳答案

那这个呢

Manipulate[Plot[f*g, {x, -1, 1}],
Evaluate@
With[{styleAndpopup =
Function[{st, fun},
{
Style[st],
PopupMenu[Dynamic[fun], {x, x^2, x^3}, ImageSize -> Tiny]
},
HoldAll]},
Grid[{styleAndpopup["f(x)=", f], styleAndpopup["g(x)=", g]}]]]

这实际上是代码生成的一个小例子,因为如果您查看 FullForm结果 Manipulate ,您将看到最初使用的相同表达式。 styleAndpopup这里实际上不是一个函数,而是一个宏,使用 With 本地定义.

编辑

根据 OP 的要求 - 推广到许多控件。最简单的解决方法是插入 Sequence@@...Sequence @@ {First@control1[... .但是,也有一些无关的东西可以删除:
Manipulate[{x, y}, 
Evaluate@With[{control1 =
Function[{var, initialValue, str, from, to, incr},
Unevaluated@{{var, initialValue, str}, from, to, incr, ImageSize -> Tiny},
HoldAll]},
Sequence @@ {
control1[x, 0, "x=", 0, 1, .1],
control1[y, 0, "y=", 0, 2, .1],
control1[z, 0, "z=", 0, 10, .1]}]]

关于wolfram-mathematica - 如何定义部分 Manipulate 控制变量定义以减少代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7551647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com