相关疑难解决方法(0)

Mathematica的模式匹配效果不佳?

我最近询问为什么PatternTest导致大量不必要的评估:PatternTest没有优化? 列昂尼德回答说,对我来说这是一个相当可疑的方法是必要的.我可以接受,尽管我更喜欢更有效的选择.

我现在意识到,我相信列昂尼德已经说了一段时间,这个问题在Mathematica中运行得更深,我感到很困扰.我无法理解为什么这不是或不能更好地优化.

考虑这个例子:

list = RandomReal[9, 20000];
Head /@ list; // Timing
MatchQ[list, {x__Integer, y__}] // Timing
Run Code Online (Sandbox Code Playgroud)
{0., Null}
{1.014, False}

检查列表的头部基本上是即时的,但检查模式需要一秒钟.当然,Mathematica可以认识到,由于列表的第一个元素不是整数,因此模式不能匹配,与PatternTest我的情况不同,我看不出模式中是否存在任何可变性.对此有何解释?


关于打包数组似乎有些混乱,据我所知,这与这个问题无关.相反,我担心所有列表上的O(n 2)时间复杂度,打包或解包.

performance wolfram-mathematica pattern-matching

13
推荐指数
1
解决办法
554
查看次数

Mathematica中PatternTest的意外行为

我正在研究玩具问题,以帮助我理解Mathematica中模式匹配的想法.以下代码的行为与我的预期不符,我无法弄清楚我对PatternTest的理解有什么问题.

MatchQ[{2, 1, 2, 5}, {x__?(FromDigits[{#}] > 3 &), y__}]
Run Code Online (Sandbox Code Playgroud)

我期望这段代码检查列表是否{2,1,2,5}可以写成两个连续(非空)序列,这样我们从第一个序列得到的整数大于3.因为{Sequence[2,1],Sequence[2,5]}是重写列表的一种方法FromDigits[{2,1}] > 3,我希望该代码返回值True.但事实并非如此.

我对代码的解释有什么问题?

wolfram-mathematica

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