小编Nas*_*ser的帖子

为什么即使只使用一个规则和一个表达式,Replace和ReplaceAll也会给出不同的结果?

也许有人可以向我解释为什么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)

wolfram-mathematica

11
推荐指数
2
解决办法
1314
查看次数

为什么"<! - "会注释掉一个样式规则,但"<! - "不会?

放轻松我吧.我只是在学习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)

html css comments

11
推荐指数
2
解决办法
1万
查看次数

是否可以在播种时访问部分列表内容,还是必须等待它收获?

我一直在学习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更新.

我会告诉你如何在没有母猪的情况下做到这一点,但你知道,我正在使用 …

wolfram-mathematica

10
推荐指数
1
解决办法
794
查看次数

关于在函数之间传递数据的简单问题

简单的问题,但我要求确保我不会忽视一个更有效的明显解决方案.

如果有一个大数据缓冲区,比如非常大的列表,需要更新,并希望将其传递给函数以在函数内部进行更新,如

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)

wolfram-mathematica wolfram-cdf

9
推荐指数
2
解决办法
1424
查看次数

如何告诉Mathematica将0替换为0?

专家;

特定

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)

wolfram-mathematica

9
推荐指数
2
解决办法
2779
查看次数

如何在Mathematica中以惯用的方式将每个0替换为列表中的前一个元素?

这是一个有趣的小问题,我想与专家一起检查是否有更好的功能/ 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,0004 million.该ReplaceRepeated方法对大型列表不适用.

更新2

由于我在复制其中一个测试时出错,删除了上面在update1中显示的结果.

更新的结果如下.列昂尼德方法是最快的.祝贺列昂尼德.一种非常快速的方法.

在此输入图像描述

测试程序如下:

(*version 2.0 *) …
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica

9
推荐指数
4
解决办法
448
查看次数

如何在Mathematica笔记本中对齐注释?

我不知道之前是否有人询问过这件事.简单的格式化问题.我注意到有时很难将评论(----)排在彼此之上.必须是字体类型问题.如果我可以让事情完全相互对齐,它在屏幕上看起来会好一点.这是一个例子:

(*                        *)
(*  L E F T    P A N E L  *)
(*                        *)
Run Code Online (Sandbox Code Playgroud)

但它实际上在我面前的笔记本中看起来像这样:

在此输入图像描述

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

在此输入图像描述

所以,不能让它对齐.我正在使用Input(标准单元格)类型的单元格.

我不能使用其他细胞类型,如Code等.我想知道是否有人知道让这个对齐的技巧.

谢谢

编辑1:在样式表演示中显示输入单元格使用的字体

在此输入图像描述

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

编辑3:

好吧,党不会持续很长时间.在演示中不允许使用SetOptions.太糟糕了,因为Alexey的解决方案效果很好,并使评论保持一致并且看起来更好.

无论如何.真的没什么大不了的.可以忍受一点点错位评论:)

在此输入图像描述

wolfram-mathematica mathematica-frontend

7
推荐指数
2
解决办法
4750
查看次数

如何在源级别区分2个笔记本?

任何人都知道一个工具来找到源级别的2个笔记本之间的差异?

工作台2中的比较笔记本工具似乎在内部数据结构级别工作,这对我没用.我正在寻找能够查看源级差异的工具(在查看笔记本时看到的内容,即不是FullForm).

我在Windows上使用Mathematica的V8.

EDIT1:

我如何以更易读的形式显示NotebookDiff的输出/报告?

在此输入图像描述

wolfram-mathematica

7
推荐指数
2
解决办法
1255
查看次数

一种有效的数据结构或方法,用于管理随时间增长的绘图数据

我想问一下,我管理绘图结果的以下方式是否有效地使用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秒),然后我知道要分配多少. …

wolfram-mathematica

7
推荐指数
1
解决办法
899
查看次数

如何在最新的notepad++编辑器中启用文档列表面板?

我刚刚更新到 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 版本中不再存在该功能

notepad++

7
推荐指数
1
解决办法
5396
查看次数