也许有人可以向我解释为什么Replace给出一个不同的答案ReplaceAll,即使我使用一个规则,而且,我认为,我有一个表达式.
根据文件:
ReplaceAll looks at each part of expr, tries all the rules on it, and then goes on to
the next part of expr. The first rule that applies to a particular part is used; no
further rules are tried on that part, or on any of its subparts
Run Code Online (Sandbox Code Playgroud)
并为替换
A list of rules can be given. The rules are tried in order. The result of the first
one that applies is returned. If none …Run Code Online (Sandbox Code Playgroud) 放轻松我吧.我只是在学习HTML.
收录http://www.w3.org/TR/html-markup/syntax.html#comments以及我见过的许多其他网站http://www.w3schools.com/tags/tag_comment.asp
他们说HTML评论 <!-- text -->与!下一个破折号之间没有空格.
然而,我在下面说明,只有当我写的时候<! -- test --> 才会被忽略.注意在<!和之间添加的空间 --
这是HTML代码
<!DOCTYPE HTML>
<html>
<head>
<style type="text/css">
<!-- td {border: 1px solid gray;} -->
</style>
</head>
<body>
<table>
<tr> <td> test </td> </tr>
</table>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
在你运行之前,桌子是否应该有边框?
如果text/css中的东西真的被注释掉了,那么表格不应该有边框,对吧?但确实如此.我在linux mint 14下的Chrome版本24.0.1312.52上尝试了这个,还有firefox 18.0
现在当我将线路更改为
<! -- td {border: 1px solid gray;} -->
Run Code Online (Sandbox Code Playgroud)
现在注意额外的空间.然后表格显示没有预期的边框.当我实际删除整行时也是如此:
<!DOCTYPE HTML>
<html>
<head>
<style type="text/css">
</style>
</head>
<body>
<table>
<tr> <td> test </td> </tr>
</table>
</body>
</html> …Run Code Online (Sandbox Code Playgroud) 我一直在学习Sow/Reap.它们很酷.但我需要帮助,看看我是否可以使用它们来做我将在下面解释的内容.
我想做的是:绘制NDSolve运行时的解决方案.我以为我可以Sow[]用来收集解决方案(x,y [x])作为NDSolve运行使用EvaluationMonitor.但是我不想等到最后,Reap然后绘制解决方案,但是想要在运行时这样做.
我将展示基本的设置示例
max = 30;
sol1 = y /.
First@NDSolve[{y'[x] == y[x] Cos[x + y[x]], y[0] == 1},
y, {x, 0, max}];
Plot[sol1[x], {x, 0, max}, PlotRange -> All, AxesLabel -> {"x", "y[x]"}]
Run Code Online (Sandbox Code Playgroud)

使用Reap/Sow,可以收集数据点,并在此结束时绘制解决方案
sol = Reap[
First@NDSolve[{y'[x] == y[x] Cos[x + y[x]], y[0] == 1},
y, {x, 0, max}, EvaluationMonitor :> Sow[{x, y[x]}]]][[2, 1]];
ListPlot[sol, AxesLabel -> {"x", "y[x]"}]
Run Code Online (Sandbox Code Playgroud)

好的,到目前为止一切顺利.但我想要的是访问部分正在构建的列表,因为它累积Sow并绘制解决方案.我知道的唯一设置是如何让Dynamic ListPlot在数据更改时刷新.但我不知道如何使用Sow将部分构建解决方案移动到此数据以便ListPlot更新.
我会告诉你如何在没有母猪的情况下做到这一点,但你知道,我正在使用 …
简单的问题,但我要求确保我不会忽视一个更有效的明显解决方案.
如果有一个大数据缓冲区,比如非常大的列表,需要更新,并希望将其传递给函数以在函数内部进行更新,如
a = Table[0,{10}]
a = update[a]
Run Code Online (Sandbox Code Playgroud)
并且因为我不能使用pass by reference(在CDF中,不能将函数的Atrributes更改为任何东西,例如HoldFirst),然后我被迫在函数内部按顺序复制列表更新它,并返回副本.
我的问题,除了使用不好的"全局变量"之外,还有更有效的方法吗?
PS.大约一年前,我通过引用询问了复制,这里是 我的Mathgroup问题的链接.(感谢Leonid回答btw,是有用的答案).
但我的问题在这里有点不同,因为现在我不能使用HoldFirst,还有其他任何我没有看到的替代方案,以避免这种额外的数据复制,它似乎会在程序变大时减慢程序的速度大.
(不能使用SetAttributes及其朋友,不允许使用CDF).
我将首先展示基本示例,然后展示如果我可以使用HoldFirst,我将如何做.
update[a_List] := Module[{copyOfa = a}, copyOfa[[1]] = 5; copyOfa]
a = Table[0, {10}];
a = update[a]
----> {5, 0, 0, 0, 0, 0, 0, 0, 0, 0}
Run Code Online (Sandbox Code Playgroud)
如果我可以使用HoldFirst,我会写
update[a_] := Module[{}, a[[1]] = 5; a]
Attributes[update] = {HoldFirst};
a = Table[0, {10}];
a = update[a]
----> {5, 0, 0, 0, 0, 0, 0, 0, 0, 0}
Run Code Online (Sandbox Code Playgroud)
效率更高,因为没有复制.通过引用传递.
我可以使用全局变量,如
a …Run Code Online (Sandbox Code Playgroud) 专家;
特定
f = (#1^#2) &
Run Code Online (Sandbox Code Playgroud)
有没有办法在上面定义'f',如果#1 和#2都为零,那么纯函数'f'的值应该是1?
这样我写的时候
f[0,0]
Run Code Online (Sandbox Code Playgroud)
它将返回1而不是不确定?
顺便说一句,我知道我可以写
f = (If[#1 == 0 && #2 == 0, 1, #1^#2]) &
Run Code Online (Sandbox Code Playgroud)
但我想要一个通用规则或模式,所以我不必编写这些检查,因为纯函数可能更复杂(其中有许多#)并且我不想做很多这些'if then else'检查可能出现的每个可能0 ^ 0.
谢谢
更新:
也许我应该澄清更多为什么我这样做.
我有一个用户从菜单中选择一个功能.功能是
a x^n0 + b y^n1 + c x^n2 y^n3
Run Code Online (Sandbox Code Playgroud)
在上面的地方,参数'n0','n1','n2'和'n3'也可以从滑块中选择,并且这些参数可以为零.
现在,'x'和'y'是坐标,这些也可以是零.
因此,在评估上述函数时可能会遇到0 ^ 0.
在我自己做的时候,有很多情况需要检查.例如,'y ^ n3'可以是0 ^ 0而不是另一个,y ^ n1可以是0 ^ 0而不是另一个,x ^ n2 y ^ n3可以是0 ^ 0而不是其他等等. ,所以我必须定义许多不同的案例.(我认为16种可能的情况).
我试图避免这种情况.如果我可以告诉Mathematica在较低级别将0 ^ 0替换为1,那么生活会更简单.
更新12/7/11 感谢大家的回答和评论,一切都非常有用,解决了我的问题,并从中学习.
我选择了Leonid的答案,因为它允许我用最少的额外编码来解决我的问题.
这是一个小例子
Manipulate[Row[{format[x, n], "=", eval[x, n]}],
{{x, 0.0, "x="}, …Run Code Online (Sandbox Code Playgroud) 这是一个有趣的小问题,我想与专家一起检查是否有更好的功能/ Mathematica方法来解决它而不是我做的.我不是太高兴我的解决方案,因为我用大IF THEN ELSE在里面,也没有找到一个Mathematica命令使用容易做到这一点(如Select,Cases,Sow/Reap,Map...等...)
给出列表值(数字或符号),这是问题,但为简单起见,我们假设现在有一个数字列表.列表可以包含零,目标是用前面看到的元素替换每个零.
最后,列表中不应包含零.
给出一个例子
a = {1, 0, 0, -1, 0, 0, 5, 0};
Run Code Online (Sandbox Code Playgroud)
结果应该是
a = {1, 1, 1, -1, -1, -1, 5, 5}
Run Code Online (Sandbox Code Playgroud)
它应该以最有效的方式完成.
这就是我能想到的
Scan[(a[[#]] = If[a[[#]] == 0, a[[#-1]], a[[#]]]) &, Range[2, Length[a]]];
Run Code Online (Sandbox Code Playgroud)
我想知道我是否可以使用Sow/Reap,但不知道如何.
问题:这可以用更实用的/ Mathematica方式解决吗?越短越好的当然:)
更新1 感谢大家的回答,所有这些都是非常好的学习.这是速度测试的结果,在V 8.04上,使用Windows 7,4 GB Ram,intel 930 @ 2.8 Ghz:
我已经测试中给出的方法n,从100,000到4 million.该ReplaceRepeated方法对大型列表不适用.
更新2
由于我在复制其中一个测试时出错,删除了上面在update1中显示的结果.
更新的结果如下.列昂尼德方法是最快的.祝贺列昂尼德.一种非常快速的方法.

测试程序如下:
(*version 2.0 *) …Run Code Online (Sandbox Code Playgroud) 我不知道之前是否有人询问过这件事.简单的格式化问题.我注意到有时很难将评论(----)排在彼此之上.必须是字体类型问题.如果我可以让事情完全相互对齐,它在屏幕上看起来会好一点.这是一个例子:
(* *)
(* L E F T P A N E L *)
(* *)
Run Code Online (Sandbox Code Playgroud)
但它实际上在我面前的笔记本中看起来像这样:

如果我在第二行中向左移动一个空格,它就像这样:

所以,不能让它对齐.我正在使用Input(标准单元格)类型的单元格.
我不能使用其他细胞类型,如Code等.我想知道是否有人知道让这个对齐的技巧.
谢谢
编辑1:在样式表演示中显示输入单元格使用的字体

编辑2:使用Alexey Popkov下面显示的代码修复了注释的字体问题,现在它们很容易对齐.这是一个截屏

编辑3:
好吧,党不会持续很长时间.在演示中不允许使用SetOptions.太糟糕了,因为Alexey的解决方案效果很好,并使评论保持一致并且看起来更好.
无论如何.真的没什么大不了的.可以忍受一点点错位评论:)

任何人都知道一个工具来找到源级别的2个笔记本之间的差异?
工作台2中的比较笔记本工具似乎在内部数据结构级别工作,这对我没用.我正在寻找能够查看源级差异的工具(在查看笔记本时看到的内容,即不是FullForm).
我在Windows上使用Mathematica的V8.
EDIT1:
我如何以更易读的形式显示NotebookDiff的输出/报告?

我想问一下,我管理绘图结果的以下方式是否有效地使用Mathematica,以及是否有更"实用"的方法.(可能正在使用Sow,Reap等).
问题是基本问题.假设您想要模拟一个物理过程,例如钟摆,并希望在运行时(或任何其他类型的结果)绘制解决方案的时间序列(即时间与角度).
为了能够显示绘图,需要在运行时保留数据点.
以下是一个简单的示例,它绘制了解决方案,但只绘制了当前点,而不是完整的时间序列:
Manipulate[
sol = First@NDSolve[{y''[t] + 0.1 y'[t] + Sin[y[t]] == 0, y[0] == Pi/4, y'[0] == 0},
y, {t, time, time + 1}];
With[{angle = y /. sol},
(
ListPlot[{{time, angle[time]}}, AxesLabel -> {"time", "angle"},
PlotRange -> {{0, max}, {-Pi, Pi}}]
)
],
{{time, 0, "run"}, 0, max, Dynamic@delT, ControlType -> Trigger},
{{delT, 0.1, "delT"}, 0.1, 1, 0.1, Appearance -> "Labeled"},
TrackedSymbols :> {time},
Initialization :> (max = 10)
]
Run Code Online (Sandbox Code Playgroud)

上面的内容并不有意思,因为只看到一个点移动,而不是完整的解决方案路径.
目前我处理这个问题的方法是使用Table[]一个足够大的缓冲区来分配可以生成的最大可能时间序列大小.
问题是时间步长可以改变,而且越小,产生的数据就越多.
但是因为我知道可能的最小时间步长(在这个例子中是0.1秒),并且我知道运行的总时间(这里是10秒),然后我知道要分配多少. …
我刚刚更新到 notepad++ V 8.1.3,它不再提供在左侧面板中显示打开文件的选项。
如何再次启用文档列表面板?我也看了这个问题notepad-show-open-files-on-the-left,但他们都说同样的事情
Settings > Preferences > tab General > Document List Panel > check Show
Windows 10 的 8.1.3 版本中不再存在该功能