gpt4 book ai didi

wolfram-mathematica - 在 Mathematica 中使用 PatternSequence 和 Cases 来查找峰值

转载 作者:行者123 更新时间:2023-12-04 16:36:19 25 4
gpt4 key购买 nike

给定的坐标对

data = {{1, 0}, {2, 0}, {3, 1}, {4, 2}, {5, 1}, 
{6, 2}, {7, 3}, {8, 4}, {9, 3}, {10, 2}}

我想提取峰谷,因此:
{{4, 2}, {5, 1}, {8, 4}}

我目前的解决方案是这种笨拙:
Cases[
Partition[data, 3, 1],
{{ta_, a_}, {tb_, b_}, {tc_, c_}} /; Or[a < b > c, a > b < c] :> {tb, b}
]

您可以看到,首先使用 Partition 将数据集的大小增加三倍.我认为可以使用 CasesPatternSequence提取此信息,但此尝试不起作用:
Cases[
data,
({___, PatternSequence[{_, a_}, {t_, b_}, {_, c_}], ___}
/; Or[a < b > c, a > b < c]) :> {t, b}
]

产生 {} .

我认为该模式没有任何问题,因为它适用于 ReplaceAll :
data /. ({___, PatternSequence[{_, a_}, {t_, b_}, {_, c_}], ___} 
/; Or[a < b > c, a > b < c]) :> {t, b}

这给出了正确的第一个峰值, {4, 2} .这里发生了什么?

最佳答案

您失败的尝试不起作用的原因之一是 Cases默认情况下,在表达式的级别 1 上查找匹配项。由于您在级别 0 上寻找匹配项,因此您需要执行以下操作

Cases[
data,
{___, {_, a_}, {t_, b_}, {_, c_}, ___} /; Or[a < b > c, a > b < c] :> {t, b},
{0}
]

但是,这只会返回 {4,2}作为解决方案,所以它仍然不是您想要的。
要在不分区的情况下查找所有匹配项,您可以执行以下操作
ReplaceList[data, ({___, {_, a_}, {t_, b_}, {_, c_}, ___} /; 
Or[a < b > c, a > b < c]) :> {t, b}]

返回
{{4, 2}, {5, 1}, {8, 4}}

关于wolfram-mathematica - 在 Mathematica 中使用 PatternSequence 和 Cases 来查找峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7287146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com