2010-02-26 29 views
5

Me pregunto si hay una manera eficiente en MATLAB para generar todos los vectores de una longitud fija con elementos de un conjunto finito.Generando vectores en MATLAB

Por ejemplo, ¿cómo puedo construir todos los vectores de longitud 5 con solo 0 o 1 como elementos?

Respuesta

3

no es exactamente lo que necesita, pero permv genera permutaciones de vectores. Si no encuentra la solución exacta, puede adaptar las permutaciones de vectores.

permv

+0

Gracias! Creo que esto es exactamente lo que necesito. –

+0

@Kiran: tenga en cuenta que primero tiene que elegir un vector de 5 elementos de unos y ceros para comenzar, entonces PERMS le dará cada permutación de eso. – gnovice

+0

Gracias por el consejo, gnovice. Esto hace que mi código sea mucho más rápido que antes y eso es realmente bueno. –

1

Nueva respuesta:

Puede acelerar la solución DEC2BINsuggested by AB (con una asistencia por woodchips) por lugar de utilizar la función BITGET. Hay dos maneras de abordar esto. El primero utiliza la función REPMAT para hacer las entradas iguales en tamaño (ambas matrices 32-by-5):

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

y la segunda llama simplemente BITGET una vez por cada bit individual que desea obtener:

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

y aquí están algunos tiempos de muestreo:

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

Como se puede ver, el BITGET desenrollado es muy rápido.


vieja respuesta: (para la posteridad)

Si estás interesado en la construcción de una matriz de cada posible vector de de ceros y unos que tiene una longitud de 5, esto sería una forma hacerlo utilizando las funciones PERMS y UNIQUE (desde PERMS crea filas repetidas):

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 forma correcta de construir todos los vectores de longitud 5 con solo 0 o 1 como elementos es

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

Espero que vean por qué.

+0

+1 Buena respuesta. El único inconveniente posible es que DEC2BIN puede ser * dolorosamente * lento. – gnovice

+1

@gnovice: me has hecho ir y ver la fuente DEC2BIN. Sí, probablemente no sea muy eficiente, ¡pero es tan lindo! Gracias. – AVB

+3

En lugar de bucles, acostúmbrese a no hacer bucles. >> tic, a = ceros (10,1024); para x = 0: 1023, a (:, x + 1) = str2num (dec2bin (x, 10) '); end, toc El tiempo transcurrido es 0.105492 segundos. >> tic, a = dec2bin (0: 1023) - '0'; toc El tiempo transcurrido es 0.000868 segundos. –

3

MathWorks' FileExchange es su amigo:

Así, utilizando la primera función, su tan fácil como:

VChooseKRO([0 1], 5) 

Usted puede incluso hacer que funcione para una serie de células de cuerdas como el conjunto finito:

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