2010-08-20 2 views
2

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

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

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

Я визуализации использовать его как-то так:

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

ответ

3

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

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, {[email protected]}, {}], 
    Select[Partition[list, 3, 1], [email protected]@#&][[All,2]], 
    If[lastq, {[email protected]}, {}]] 

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

+0

Благодарим вас за помощь. Я использовал его для еще одной проблемы. Вещь я понял, что мои помещения были неправы. Я не могу делать то, что я себе представлял, таким статическим способом. Итерации слева направо, мне нужно проверить все 3-группы, да, но если условие trinaryfunc не выполняется, я бы выгнал этот элемент n и повторил тестовое условие с новой 3-группой, состоящей из элементов n- 1, n + 1 и n + 2. Возможно, я мог бы повторить функцию SelectWN до тех пор, пока никаких изменений не произойдет, но это приведет к двойному вычислению для окончательных 3-групп. Я думаю, что итеративный подход - это тот, который стоит здесь. – fabb

Смежные вопросы