2010-02-26 5 views
5

Je me demande s'il existe un moyen efficace dans MATLAB de générer tous les vecteurs d'une longueur fixe avec des éléments d'un ensemble fini.Générer des vecteurs dans MATLAB

Par exemple, comment puis-je construire tous les vecteurs de longueur 5 avec seulement 0 ou 1 comme éléments?

Répondre

3

pas tout à fait ce dont vous avez besoin, mais permv génère des permutations de vecteur. Si vous ne trouvez pas de solution exacte, vous pouvez adapter les permutations vectorielles.

permv

+0

Merci! Je pense que c'est exactement ce dont j'ai besoin. –

+0

@Kiran: Gardez à l'esprit que vous devez d'abord choisir un vecteur à 5 éléments de uns et de zéros pour commencer, puis PERMS vous donnera toutes les permutations de cela. – gnovice

+0

Merci pour le conseil, gnovice. Cela rend mon code beaucoup plus rapide que plus tôt et c'est vraiment bien. –

1

Nouvelle réponse:

Vous pouvez accélérer la solution DEC2BINsuggested by AB (avec une aide par woodchips) par la place en utilisant la fonction BITGET. Il y a deux façons d'aborder cela. La première utilise la fonction REPMAT pour rendre les entrées de taille égale (les deux 32 par-5 matrices):

allCombos = bitget(repmat((0:31)',1,5),repmat(5:-1:1,32,1)); 

et le second appelle simplement BITGET une fois pour chaque bit individuel que vous voulez obtenir:

vec = (0:31)'; 
allCombos = [bitget(vec,5) bitget(vec,4) bitget(vec,3) ... 
      bitget(vec,2) bitget(vec,1)]; 

Et voici quelques exemples: horaires d'

 Method  | Average Time 
-----------------+------------------ 
    DEC2BIN  | 0.000788 s 
    BITGET+REPMAT | 0.000727 s 
    BITGET x5  | 0.000045 s 

Comme vous pouvez le voir, la BITGET déroula est très rapide.


Vieille réponse: (pour la postérité)

Si vous êtes désireux de construire une matrice de tous les vecteurs possibles de zéros et ceux qui a une longueur de 5, ce serait une façon de le faire en utilisant les fonctions PERMS et UNIQUE (depuis PERMS crée des lignes répétées):

allCombos = [0 0 0 0 0; 
      unique(perms([0 0 0 0 1]),'rows'); ... 
      unique(perms([0 0 0 1 1]),'rows'); ... 
      unique(perms([0 0 1 1 1]),'rows'); ... 
      unique(perms([0 1 1 1 1]),'rows'); ... 
      1 1 1 1 1]; 
10

La façon de construire tous les vecteurs de longueur 5 avec seulement 0 ou 1 comme éléments est

a = dec2bin(0:31,5) - '0'; 

J'espère que vous voyez pourquoi.

+0

+1 Bonne réponse. Le seul inconvénient possible est que DEC2BIN peut être * douloureusement * lent. – gnovice

+1

@gnovice: Vous m'avez fait partir et regarder la source de DEC2BIN. Oui, ce n'est probablement pas très efficace - mais c'est un si mignon! Merci. – AVB

+3

Plutôt que de boucler, vous devez vous habituer à ne pas boucler. >> tic, a = zéros (10,1024); pour x = 0: 1023, a (:, x + 1) = str2num (dec2bin (x, 10) '); fin, toc Le temps écoulé est 0.105492 secondes. >> tic, a = dec2bin (0: 1023) - '0'; toc Le temps écoulé est de 0,000868 secondes. –

3

MathWorks' FileExchange est votre ami:

Donc, en utilisant la première fonction, son aussi facile que:

VChooseKRO([0 1], 5) 

Vous pouvez même le faire fonctionner pour un réseau de cellules de chaînes que l'ensemble fini:

C = {'a' 'b' 'c' 'd'}; 
C(VChooseKRO(1:numel(C), 2)) 
Questions connexes