Générer toutes les combinaisons contenant au moins un élément d'un ensemble donné en Matlab
- Je utiliser combnk
pour générer une liste de combinaisons. Comment puis-je générer un sous-ensemble de combinaisons, qui comprend toujours des valeurs particulières. Par exemple, pour combnk(1:10, 2)
je n'ai besoin que de combinaisons qui contiennent 3 et/ou 5. Est-il un moyen rapide de faire cela?
Si vous n'êtes pas trop limité par les performances, vous pouvez simplement la force brute, c'est à dire créer un grand nombre de combinaisons et ensuite de sélectionner seulement les bons.
OriginalL'auteur Eduardas | 2010-10-25
Vous devez vous connecter pour publier un commentaire.
Bien, dans votre exemple, le choix de deux nombres entiers à partir de l'ensemble {1, ..., 10} tels que des élus, des entiers est de 3 ou 5 rendements 9+9-1 = 17 combinaisons connues, de sorte que vous pouvez simplement les énumérer.
En général, pour trouver tous les n-choisissez-k combinaisons de nombres entiers {1, ..., n} qui contiennent des entiers m, c'est la même chose que de trouver la (n-1)-choisir-(k-1) combinaisons de nombres entiers {1, ..., m-1, m+1, ..., n}.
Dans matlab, qui serait
(Ce code est toujours valide même si
m
est de 1 ou n.)OriginalL'auteur Steve Tjoa
Pour une attaque par force brute solution, vous pouvez générer tous vos combinaisons avec COMBNK utiliser les fonctions de la TOUT et ISMEMBER afin de trouver les combinaisons qui contiennent un ou plus d'un sous-ensemble de nombres. Voici comment vous pouvez le faire en utilisant votre exemple ci-dessus:
EDIT:
Pour une solution plus élégante, on dirait Steve et j'ai eu une idée similaire. Cependant, j'ai généralisé la solution de sorte qu'il fonctionne pour un nombre arbitraire d'éléments requis, et pour les éléments répétés dans
v
. La fonction SUBCOMBNK trouverez toutes les combinaisons dek
valeurs prises à partir d'un ensemblev
qui comprennent au moins l'une des valeurs dans l'ensemblevSub
:Vous pouvez tester cette fonction à l'encontre de la force brute de la solution ci-dessus pour voir qu'il retourne le même résultat:
J'ai encore testé cette fonction, contre la force brute de la solution à l'aide de
v = 1:15;
etvSub = [3 5];
pour les valeurs deN
allant de 2 à 15. Les combinaisons créées sont identiques, mais SUBCOMBNK a été nettement plus rapide, comme indiqué par la moyenne des temps d'exécution (ms) de l'affiche ci-dessous:OriginalL'auteur gnovice
Juste pour améliorer Steve réponse : dans votre cas (vous voulez toutes les combinaisons avec 3 et/ou 5) il sera
Facilement généralisée pour tout autre cas de ce type.
OriginalL'auteur green-fr