2010-08-20 3 views
2

Dans Mathematica, la commande Sélectionner uniquement permet de définir un critère de sélection pour chaque élément d'une liste à lui seul."Sélectionner" pour comparer les éléments voisins dans Mathematica

Je souhaite spécifier un critère dépendant d'une fonction de l'élément précédent et/ou suivant et d'une fonction sur tous les éléments, respectivement. Le premier et le dernier élément ne peuvent pas être testés de cette façon, mais ils doivent être sélectionnés de toute façon.

Faire cela itérativement ne serait probablement pas un problème, je veux d'abord essayer fonctionnel.

J'imagerie à l'aide en quelque sorte comme ça:

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

Répondre

3

Je suggère d'utiliser la fonction de partition. Pour obtenir chaque élément d'une liste groupée avec ses voisins immédiats, vous pouvez le faire

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

pour obtenir ceci:

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

Sachant que, nous pouvons faire une fonction « sélectionner avec les voisins » qu'approximativement matchs vos spécifications:

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

Notez que dans les arguments à trinaryfunc, # 2 est l'élément de la liste elle-même, # 1 est le voisin de gauche, et # 3 est le voisin de droite. Il serait bon de généraliser ceci pour utiliser n'importe quel nombre de voisins, pas seulement les voisins immédiats, mais alors vous voudriez un meilleur moyen de se référer à eux que l'analogue de {# 1, # 2, # 3}.

+0

Nous vous remercions de votre aide. Je l'ai utilisé pour un autre problème que j'avais. Chose est que j'ai réalisé que mes prémisses étaient erronées. Je ne peux pas faire ce que j'ai imaginé de manière statique comme ça. En itérant de gauche à droite, j'ai besoin de vérifier tous les 3 groupes, oui, mais si la condition trinaryfunc ne tient pas, j'enlèverais cet élément n et je répéterais la condition de test avec le nouveau groupe constitué des éléments n- 1, n + 1 et n + 2. Peut-être que je pourrais répéter la fonction SelectWN jusqu'à ce que plus aucun changement ne se produise, mais cela entraînerait un double calcul pour les 3 derniers groupes. Je suppose que l'approche itérative est la seule à aller ici. – fabb

Questions connexes