在尝试粘贴图像时,我发现这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上做了这个,不确定其他系统上的粘贴代码是否相同.)
请注意,Cases与Part直接使用相比,使用提取数据非常慢,即使我明确告诉Cases我只需要一个匹配.
我确实发现(如上所示)Cases由于某种原因触发解包,即使搜索应该在它到达内部的打包数组之前停止.使用比Infinity可能避免解包的浅层规范.
问题:Cases在这里 使用比Part(如果子表达式可以出现在不同的位置怎么样?)更容易和更可靠?有没有办法在Cases这里快速,可能通过使用不同的模式或不同的选项?
可能相关的问题:Mathematica的模式匹配效果不佳? …
在准备对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那么给定的模式不能匹配?
借用尤达的回答中的一个例子,这是另一个看似过度评价的例子:
In[1]:= test2 = (Print@##; Positive@##) &;
MatchQ[{1, 2, 3, 4, -5}, {x__?test2, y__?Negative}]
During evaluation of …Run Code Online (Sandbox Code Playgroud)