也许有人可以向我解释为什么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 版本中不再存在该功能