«Выбрать», сравнивая соседние элементы в Mathematica - PullRequest
2 голосов
/ 20 августа 2010

В Mathematica команда Select only позволяет определять критерий выбора для каждого элемента списка самостоятельно .

Я хочу указать критерий, который зависит от функциипредыдущий и / или следующий элемент и функция для всех элементов соответственно.Первый и последний элементы не могут быть протестированы таким образом, но они должны быть выбраны в любом случае.

Выполнение этого итеративно, вероятно, не будет проблемой, я хочу сначала попробовать его функциональность.

Я бы хотелиспользуя его как-то так:

Select[list,FirstQ||LastQ,Func1[#-1,#]&&Func2[#,#1]&&Func3[list]&]

1 Ответ

3 голосов
/ 20 августа 2010

Я предлагаю использовать функцию Разделение.Чтобы получить каждый элемент списка, сгруппированный с его непосредственными соседями, вы можете сделать это

Partition[{a,b,c,d,e}, 3, 1]

, чтобы получить это:

{{a,b,c}, {b,c,e}, {c,d,e}}

Зная это, мы можем сделать «выбор с соседями»функция, которая приблизительно соответствует вашей спецификации:

SelectWN[list_, firstq_, lastq_, trinaryfunc_] := Join[
  If[firstq, {First@list}, {}], 
  Select[Partition[list, 3, 1], trinaryfunc@@#&][[All,2]], 
  If[lastq, {Last@list}, {}]]

Обратите внимание, что в аргументах trinaryfunc # 2 - это сам элемент списка, # 1 - левый сосед, а # 3 - правый сосед.Было бы неплохо обобщить это, чтобы использовать любое количество соседей, а не только непосредственных соседей, но тогда вам нужен лучший способ ссылки на них, чем аналог {# 1, # 2, # 3}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...