Это может быть не совсем та реализация, о которой вы спрашиваете, но по следующим направлениям:
ClearAll[localMaxPositions];
localMaxPositions[lst : {___?NumericQ}] :=
Part[#, All, 2] &@
ReplaceList[
MapIndexed[List, lst],
{___, {x_, _}, y : {t_, _} .., {z_, _}, ___} /; x < t && z < t :> y];
Пример:
In[2]:= test = RandomInteger[{1,20},30]
Out[2]= {13,9,5,9,3,20,2,5,18,13,2,20,13,12,4,7,16,14,8,16,19,20,5,18,3,15,8,8,12,9}
In[3]:= localMaxPositions[test]
Out[3]= {{4},{6},{9},{12},{17},{22},{24},{26},{29}}
Когда у вас есть позиции, вы можете извлечь элементы:
In[4]:= Extract[test,%]
Out[4]= {9,20,18,20,16,20,18,15,12}
Обратите внимание, что это также будет работать для плато, где у вас есть более одного максимального элемента в строке. Чтобы получить минимумы, нужно тривиально изменить код. Я действительно считаю, что ReplaceList
- лучший выбор, чем Cases
здесь.
Чтобы использовать это с вашими данными:
In[7]:= Extract[data,localMaxPositions[data[[All,2]]]]
Out[7]= {{4,2},{8,4}}
и то же самое для минимумов. Если вы хотите объединить, изменение в вышеуказанном правиле также тривиально.