相关疑难解决方法(0)

为什么案例[]这么慢?有什么技巧可以加快速度吗?

在尝试粘贴图像时,我发现这Cases[]很慢.

要重现,首先将大图像复制到剪贴板(只需按Print Screen),然后评估以下内容:

In[33]:= SetSystemOptions["PackedArrayOptions" -> "UnpackMessage" -> True];

In[34]:= AbsoluteTiming[nb = NotebookGet@ClipboardNotebook[];]
Out[34]= {0.4687500, Null}

In[35]:= AbsoluteTiming[d1 = nb[[1, 1, 1, 1, 1, 1, 1]];]
Out[35]= {0., Null}

In[36]:= AbsoluteTiming[d2 = First@Cases[nb, r_RasterBox :> First[r], Infinity, 1];]

During evaluation of In[36]:= Developer`FromPackedArray::unpack: Unpacking array in call to Notebook. >>

Out[36]= {0.9375000, Null}
Run Code Online (Sandbox Code Playgroud)

(我在Windows上做了这个,不确定其他系统上的粘贴代码是否相同.)

请注意,CasesPart直接使用相比,使用提取数据非常慢,即使我明确告诉Cases我只需要一个匹配.

我确实发现(如上所示)Cases由于某种原因触发解包,即使搜索应该在它到达内部的打包数组之前停止.使用比Infinity可能避免解包的浅层规范.

问题:Cases在这里 使用比Part(如果子表达式可以出现在不同的位置怎么样?)更容易和更可靠?有没有办法在Cases这里快速,可能通过使用不同的模式或不同的选项?


可能相关的问题:Mathematica的模式匹配效果不佳? …

performance wolfram-mathematica pattern-matching

12
推荐指数
1
解决办法
737
查看次数

PatternTest没有优化?

在准备对Mathematica中PatternTest的意外行为的响应时,我遇到了一个意想不到的Mathematica行为.

请考虑:

test = (Print[##]; False) &;
MatchQ[{1, 2, 3, 4, 5}, {x__?test, y__}]
Run Code Online (Sandbox Code Playgroud)
During evaluation of In[1]:= 1

During evaluation of In[1]:= 1

During evaluation of In[1]:= 1

During evaluation of In[1]:= 1
False

因为正如西蒙对文献的引用所简明地指出:

在一个形式中,例如__?test匹配的序列中的每个元素__ 必须True在应用测试时产生.

我想知道为什么Mathematica四次分别测试列表的第一个元素.当然,有四种方法可以构成底层模式{x__, y__},如果这是一个Condition测试,那么组成序列的所有元素x都需要进行测试,但我不认为这是这种情况.

逻辑是否认为如果列表的第一个元素失败,PatternTest那么给定的模式不能匹配?

如果它确实成立,为什么Mathematica不进行这种简单的优化?


借用尤达的回答中的一个例子,这是另一个看似过度评价的例子:

In[1]:= test2 = (Print@##; Positive@##) &;
MatchQ[{1, 2, 3, 4, -5}, {x__?test2, y__?Negative}]

During evaluation of …
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica pattern-matching

8
推荐指数
1
解决办法
299
查看次数