我有多个数字打开,我想在运行时独立更新它们.以下玩具示例应阐明我的意图:
clf;
figure('name', 'a and b'); % a and b should be plotted to this window
hold on;
ylim([-100, 100]);
figure('name', 'c'); % only c should be plotted to this window
a = 0;
b = [];
for i = 1:100
a = a + 1;
b = [b, -i];
c = b;
xlim([0, i]);
plot(i, a, 'o');
plot(i, b(i), '.r');
drawnow;
end
Run Code Online (Sandbox Code Playgroud)
这里的问题是,当我打开第二个时figure,我无法告诉plot函数绘制到第一个而不是第二个(并且只c应绘制到第二个).
我一直在开发一个gui,这需要创建Mathematica缺少的公共控件(例如spinner,treeview,openerbar等).一个是多面板,即窗格对象,它被分成两个(或更多)子窗格,其中分隔符可以由鼠标设置.这是我的双窗格版本.我想听听你的意见和想法,关于如何扩展它以处理不仅仅是2个,而是处理任何数量的子窗格,以及如何优化它.目前,对于负载很重的子窗格,它严重滞后,不知道为什么.
Options[SplitPane] = {Direction -> "Vertical",
DividerWidth -> Automatic, Paneled -> {True, True}};
SplitPane[opts___?OptionQ] :=
Module[{dummy}, SplitPane[Dynamic[dummy], opts]];
SplitPane[val_, opts___?OptionQ] := SplitPane[val, {"", ""}, opts];
SplitPane[val_, content_, opts___?OptionQ] :=
SplitPane[val, content, {100, 50}, opts];
SplitPane[Dynamic[split_, arg___], {expr1_, expr2_}, {maxX_, maxY_},
opts___?OptionQ] :=
DynamicModule[{temp, dir, d, panel, coord, max, fix, val},
{dir, d, panel} = {Direction, DividerWidth, Paneled} /. {opts} /.
Options[SplitPane];
dir = dir /. {Bottom | Top | "Vertical" -> "Vertical", _ ->
"Horizontal"};
d = d /. Automatic …Run Code Online (Sandbox Code Playgroud) 你可以yield在Mathematica中做类似Python的声明,以创建生成器吗?请参阅此处的概念.
更新
这里是一个我的意思的例子,迭代所有的排列,只使用O(n)空间:(在Sedgewick的算法书中的算法):
gen[f_, n_] := Module[{id = -1, val = Table[Null, {n}], visit},
visit[k_] := Module[{t},
id++; If[k != 0, val[[k]] = id];
If[id == n, f[val]];
Do[If[val[[t]] == Null, visit[t]], {t, 1, n}];
id--; val[[k]] = Null;];
visit[0];
]
Run Code Online (Sandbox Code Playgroud)
然后把它称为:
gen[Print,3],打印所有6个长度为3的排列.
我必须做一个类似toggler的控件,当鼠标移过它时执行一些动作,当它离开按钮时执行另一个动作,但是当鼠标结束并移动时什么都不做.
为了说清楚,仅仅找出鼠标是否在某个区域上是不够的,但只有在鼠标进入和离开该区域时它才能运行一些代码.(Szabolcs要求澄清)
遗憾的是,行为的AutoAction选择Button不同:当鼠标在对象内部移动时,它会不断尝试执行操作:
switch = False;
Button["Hover", switch = ! switch, AutoAction -> True]
Dynamic[switch]
Run Code Online (Sandbox Code Playgroud)
另一方面,一个简单的Mouseover命令无法执行每次鼠标离开对象时执行的代码:
in = out = 0;
Mouseover[
Dynamic["out", (in++) &],
Dynamic["in", (out++) &]
]
Dynamic[Column[{in, out}]]
Run Code Online (Sandbox Code Playgroud)
我认为第二个参数Dynamic可以用来定义一个Mouseover对象的起始和结束动作,但这种方法也没有成功.
start = end = False;
Dynamic[Mouseover["out", "in"], {(start = True) &, Null, (end = True) &}]
Dynamic[Column[{start, end}]]
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
如何在保留背景中的绘图的同时抑制图形窗口的显示以在运行结束时保存结果图?这样做的最佳做法是什么?目前,我的代码是这样的:
showPlot = 1; % switch to turn plotting on/off
fig = figure(1); clf; hold on;
lineHandle = line(nan, nan);
total = 0;
for i = 1:10000
% long calculation
total = total + 1;
set(0, 'CurrentFigure', fig);
xlim([0, total]);
x = [get(lineHandle, 'XData'), total];
y = [get(lineHandle, 'YData'), rand()];
set(lineHandle, 'XData', x, 'YData', y);
drawnow;
end
% saveas(gcf, file, 'png');
Run Code Online (Sandbox Code Playgroud)
我想以这样的方式设置代码:当我将showPlot设置为0时,图形窗口没有显示,但是图表被保存到文件中.
我想定义一个表单的新运算符x /==> y,其中运算符/==>被视为例如/@运算符Map,并被转换为MyFunction[x, y].有一个重要的方面:我希望结果运算符像任何两位运算符一样在前端运行,也就是说,两个字符(a Divide和a
DoubleLongRightArrow)应该连接在一起,不应出现语法着色,它们是单击时可以一起选择,因此必须设置优先级.另外,我宁愿避免使用该
Notation`包.结果,我想看到这样的事情:
In[11]:= FullForm[x/\[DoubleLongRightArrow]y]
Out[11]//FullForm= MyFunction[x,y]
Run Code Online (Sandbox Code Playgroud)
有谁知道如何实现这一目标?
Pane使用鼠标滚轮时,以下对象不会滚动.有没有人经历过同样的行为?这是默认行为吗?知道为什么吗?它可能是特定于平台的吗?
CreateDialog[Pane[Column[Range[30]], {300, 200}, Scrollbars -> True]]
Run Code Online (Sandbox Code Playgroud)
我的平台:Win7-64,Mathematica 8.0.1
我想以Grid不同的方式动态更新特定部分.考虑以下玩具示例:我有两行:一行必须逐个更新(a,b,c),因为这些符号取决于不同的触发器; 第二行取决于允许显示/隐藏某些数据的单个触发器(show).
现在我知道我可以将整个Grid结构包装起来Dynamic,甚至指定要跟踪的符号,因此这个例子做了我想要的:
Checkbox[Dynamic[show]]
test = {0, 0};
Dynamic[Grid[{{Dynamic@a, Dynamic@b, Dynamic@c},
If[show, Prepend[test, "test:"], {}]}, Frame -> All],
TrackedSymbols :> {show}]
Run Code Online (Sandbox Code Playgroud)

虽然出于某些原因我想要在本地指定Dynamic,但仅适用于第二行Grid.
对于那些想知道什么是不道德的情况的人来说,想象一下:show在任何一个中使用a,b或者c,这些我不想在show更改时更新,它们的更改取决于其他触发器.为什么不show从第一行的符号中删除呢?想象一下,我不能,因为show在一个函数中使用a,b或者c,这个函数我无法轻易访问.
当然包装Ifinto 的第一个参数在Dynamic这里没有用,因为它Grid本身或它的任何单元格都不会变得动态:
Grid[{
{Dynamic@a, Dynamic@b, Dynamic@c},
If[Dynamic@show, Prepend[test, "test:"], {}]
}, Frame …Run Code Online (Sandbox Code Playgroud) 为什么不是值b被印在下面的例子,但符号名称?如何强制打印变量的实际动态值?
a = {1, 2, 3};
DynamicModule[{b},
Print[Dynamic[b]];
{Dynamic[a], Dynamic[b]}
,
Initialization :> (b = Length[a]; a = a + 2)
]
Run Code Online (Sandbox Code Playgroud)
输出:
b$107
Out[2]= {{3, 4, 5}, 3}
Run Code Online (Sandbox Code Playgroud)
编辑(阅读你的答案/评论后):
考虑一个更简单的例子,没有Initialization代码(绕过WReach的例子):
a = {1, 2, 3};
DynamicModule[{b = Length[a]},
Print[Dynamic[b]];
{Dynamic[a], Dynamic[b]}
]
Run Code Online (Sandbox Code Playgroud)
输出:
During evaluation of In[4]:= b$602
Out[5]= {{1, 2, 3}, 3}
Run Code Online (Sandbox Code Playgroud)
请注意,如果我使用Module而不是DynamicModule或Dynamic从Print行中省略,此示例执行我想要的操作.我担心的是:
为什么第二个例子无法正确打印b的值?没有初始化,它(根据帮助)包含"一个表达式,用于评估何时首次显示DynamicModule".另外根据帮助:" DynamicModule首次评估时,首先进行局部变量的初始分配,然后Initialization评估该选项的任何设置."
帮助应该是:"初始化:一个表达式,用于评估何时首次显示结果 DynamicModule …
我想建立一个计数器,告诉我一个长迭代计算(例如in for).
是否可以设置此计数器,当它在屏幕上更新时,它会替换以前的值?
也就是说,打印a的迭代器变量for是不行的,因为Matlab要么将它打印到新行,要么在之前的值之后打印,但是在10000次迭代之后,屏幕将以任一方式填充.另外,我想在每个回合更新计数器.