- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在C语言中,如果我想在调用之间保存局部变量值,则在函数内定义局部变量时,通常在变量旁边添加“静态”一词。
这给了我变量名称的本地作用域保护,但是同时,变量值是持久的。模拟一个保存其自己的私有状态的简单对象非常有用。
http://en.wikipedia.org/wiki/Local_variable#Static_local_variables
可以使用Module[]
在Mathematica中对此进行仿真吗?还是DynamicModule[]
?
(我们知道Module[]
默认情况下不会保存局部变量状态,但是使用DynamicModule[]
怎么办?)
不使用软件包。使用它的上下文在Manipulate[]
内部。Module[]
不能在Manipulate之外。因此,一切都必须是这样的:
Manipulate[
foo[]:=Module[{a,b,c},....];
boo[]:=Module[{a,b,c},....];
... foo[] ..
... boo[]...
..,
control_variables...,
Initialization:>
(
.... global area....
)
]
DynamicModule
代替上面的
Module[]
来执行此操作,但是
DynamicModules
不能被称为函数吗?我不知道该怎么做。
#include <stdio.h>
void my_add(void)
{
static int total = 0;
total = total + 1;
printf("current total %d\n",total);
}
int main()
{
int i;
for(i = 1; i<=3; i++)
my_add();
return 0;
}
$ gcc ex.c
$ ./a.exe
current total 1
current total 2
current total 3
$
Manipulate[
n;
Module[{total = 0},
processA[] :=
(
total = total + 1
)
];
Module[{total = 0},
processB[] :=
(
total = total + 1
)
];
Grid[{
{"module A total=", processA[]},
{"module B total=", processB[]}
}],
Button["press to update state", n++],
{{n, 0}, None},
TrackedSymbols :> {n}
]
Manipulate[
n;
Grid[{
{"module A result=", aResult}
}],
Button["press to update process A", {n++; aResult = processA[n]}],
{{n, 0}, None},
{{aResult, {}}, None},
TrackedSymbols :> {n},
Initialization :>
(
Module[{total = 0},
processA[n_] :=
(
total = total + 1;
{n, total}
)
]
)
]
Manipulate[
{x, myAdd[]},
{x, 1, 10},
{{total, 0}, None},
{{myAdd, (total += 1; total) &}, None}
]
total
不能被2个不同的函数使用。
total
的名称空间遍及整个Manipulate。我想要的是,使用这种模式是这样的:
Manipulate[
ctrl;
Grid[{
{"processA result=", processA[]},
{"processB result=", processB[]}
}],
Button["step", ctrl++],
{{ctrl, 0}, None},
{{processA, Module[{total = 0}, total++] &}, None},
{{processB, Module[{total = 0}, total++] &}, None},
TrackedSymbols :> {ctrl}
]
Manipulate[
ctrl;
Grid[{
{"processA result=", processA[]},
{"processB result=", processB[]}
}],
Button["step", ctrl++],
{{ctrl, 0}, None},
{{total, 0}, None},
{{processA, Module[{}, total++] &}, None},
{{processB, Module[{}, total++] &}, None},
TrackedSymbols :> {ctrl}
]
Manipulate[
ctrl;
Print["in top of Manipulate"];
Grid[{
{"processA current total=", aResult},
{"processA current total=", bResult}
}],
Button["update A process", {ctrl++; aResult = processA[]}],
Button["update B process", {ctrl++; bResult = processB[]}],
{{ctrl, 0}, None},
{{aResult, 0}, None},
{{bResult, 0}, None},
{{processA, Module[{total = 0}, ( total = total + 1; total) &]},
None},
{{processB, Module[{total = 0}, (total = total + 1; total) &]}, None},
TrackedSymbols :> {ctrl}
]
pn
前缀其每个参数的名称,其中
n
是求解器ID号。所以我有p1StepNumber,p2StepNumber,p3StepNumber,p1Solution,p2Solution,p3Solution等...
Remove["Global`*"]
Manipulate[
ctrl;
Print["in top of Manipulate"];
Grid[{
{"processA current total=", aResult},
{"processA current total=", bResult}
}],
Button["update A process", {ctrl++; aResult = processA[]}],
Button["update B process", {ctrl++; bResult = processB[]}],
{{ctrl, 0}, None},
{{aResult, 0}, None},
{{bResult, 0}, None},
{{processA, Module[{},
(
If[! ValueQ[processA`total], processA`total = 0];
processA`total = processA`total + 1;
processA`total
) &]}, None},
{{processB, Module[{},
(
If[! ValueQ[processB`total], processB`total = 0];
processB`total = processB`total + 1;
processB`total
) &]}, None},
TrackedSymbols :> {ctrl}
]
最佳答案
试试这个:
Module[{total = 0}
, myAdd[] := (total += 1; Print["current total ", total])
]
In[2]:= myAdd[]
current total 1
In[3]:= myAdd[]
current total 2
In[4]:= myAdd[]
current total 3
total
仅对
myAdd
可见。
Module
通过创建一个新的唯一符号来实现此目的,该符号的名称由提供的符号生成(本例中为
total
)。您可以通过评估以下表达式来查看此信息:
In[5]:= Module[{total}, total]
Out[5]= total$562
myAdd
使用的符号:
In[6]:= Names["total*"]
Out[6]= {"total", "total$557", "total$562"}
In[7]:= total$557
Out[7]= 3
myAdd
的定义,我们还可以看到重命名的效果:
In[8]:= ??myAdd
Global`myAdd
myAdd[]:=(total$557+=1; Print[current total, total$557])
Manipulate
内部使用此技术,因此:
Manipulate[
{x, myAdd[]}
, {x, 1, 10}
, Initialization :>
Module[{total = 0}
, myAdd[] := (total += 1; total)
]
]
myAdd
的全局定义,则可以执行以下操作:
Manipulate[
{x, myAdd[]}
, {x, 1, 10}
, { myAdd
, Module[{total = 0}, (total += 1; total) &]
, None
}
]
myAdd
的定义位于
Manipulate
中。但是请注意,符号
myAdd
和
x
和
total
仍然是全局符号。这是因为整个
Manipulate
表达式都被读入全局上下文。如果这不能令人满意,那么我们将不得不将整个表达式放在另一个上下文中-无法回避符号必须存在于某些上下文中的事实。
Manipulate[
Module[{f, g}
, Module[{total = 0}, f[] := ++total]
; Module[{total = 0}, g[] := --total]
; Dynamic[{x, f[], g[]}]
]
, {x, 1, 10}
]
f
和
g
的定义位于单元格中
total
的两次出现是相互隔离的,并且位于单元格中
total
时,
x
变量都不会重置为零
关于wolfram-mathematica - Mathematica中有任何简单的机制可以使模块具有持久状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8624566/
我刚刚创建了一个非常大的神经网络,尽管是在非常强大的硬件上,想象一下我的震惊和失望,当我意识到 NeuralNetworks 包中的 NeuralFit[] 似乎只使用一个核心,甚至没有发挥到最大能力
我想知道是否有办法在 Mathematica 中处理大文件? 目前我有一个大约 500Mb 的文件,其中包含表数据。 Import["data.txt","Table"]; 什么是替代方式? 最佳答案
Mathematica 是否支持为数学符号安装非 Wolfram 字体? 其他数学符号字体的例子包括最近发布的 STIX 字体、微软的 Cambria 字体、Latex 下使用的 Math Tim
这是一个简单的 WolframCloud computation : 当 0 Infinity]会显示正确答案,即Boole[0Infinity] 输出应该是Boole[0 Infinity] 顺便说
在 MATHEMATICA 中是否有一种快速简便的方法来截断十进制数,比如超过 4 位? 对于 N[1/6, 4],它四舍五入为 =1.6667。 我要你切到 1.6666。 谢谢! 最佳答案 f[x
我有一个等式(因为是 VBA 代码所以使用了括号) Y=(P/(12E((bt^3)/12))*A 我知道每个变量,但不知道“b”。有什么方法可以让 Wolfram Alpha“重新定义”(而不是求解
我找到了 Wolfram Workbench Mathematica 开发的良好环境。 然而,当我在 Mathematica 中编程时,我需要经常浏览帮助系统。 Workbench 提供了一个工具提示
问题 我正在查看 Wolfram's Mathematica 生成随机数的方法,发现它使用 Cellular Automata Rule 30 .其基本解释如下: 一个基本元胞自动机的演化可以完全用一
我需要对可变数量的集合的笛卡尔积求和。假设 f[...] 是一个多元函数,定义 p[A__set] := Module[{Alist, args, iterators,it}, Alist =
当鼠标光标在 Wolfram|Alpha 中的 2D 绘图上时,会出现一对灰线,帮助您读取 x 和 y 轴的坐标 . For example ,我将鼠标悬停在以下 Airy 函数图中的转折点之一上。
我正在 Mathematica 中生成一个双面板图形。底部面板在 y 轴上具有负值,这会导致该轴上的标签(使用 FrameLabel 生成)比顶部面板上的标签向左对齐,后者具有正值。我无法将面板连接到
我有几个在 Mathematica 中生成的表达式,我想将它们导出到外部 C 程序的源代码中。 “CForm”几乎可以满足我的要求,只是求幂表示为对 Power() 的调用。 .我的表达式只涉及小幂,
Wolfram 系统建模器有一个名为 "equation browser" 的函数, youtube 视频 here (at 20:58) 介绍了“方程浏览器”,我想知道Dymola是否有相同的功能,
我有适用于 Mac 的 Mathematica 8.0 和 Wolfram Workbench 2.0。我想使用 MUnit 对我正在创建的包进行单元测试,但我发现缺少有关 MUnit 的文档令人沮丧
我希望能够通过具有大量内存的计算机的命令行来处理 Wolfram 语言。这似乎很容易通过 GCP 实现。我会创建一个大实例,根据需要使用它,然后删除该实例。我很好奇,我将如何在 GCP 上安装和设置
给定字符串中符号的名称,如何多次为其赋值?例如,假设我想定义一个名称为 varname 的值的符号,并且我想为它分配一个值: varname = "foo" Symbol[varname]=5 这是行
我的笔记本中有类似以下内容。 test1[g_] := (g == 5); test2[g_] := (g == 6); tests={"test1", "test2"} ToExpression[#
我正在尝试学习一些 Julia,在阅读了几个小时的手册后,我编写了以下代码: ie = 200; ez = zeros(ie + 1); hy = zeros(ie); fdtd1d (steps)=
不确定我正在尝试做的事情是否有意义。我正在用mathematica 对一些代码进行原型(prototype)设计,有一天我希望用C++ 编写。我只能以 double 计算的环境(因为我使用的是 MS
我经常希望看到不在 FullForm 中的 Mathematica 图形对象的内部表示。但更具可读性 InputForm能够通过双击选择部分代码,并轻松将此代码复制到新输入 Cell .但默认Inpu
我是一名优秀的程序员,十分优秀!