2011-05-27 14 views
21

Para un vector V de tamaño nx 1, me gustaría para crear matriz indicador binario M del tamaño nx Max (V) de tal manera que las entradas de fila de M tienen en el índice de columnas correspondiente, de lo contrario.Creación de Matriz de indicadores

Por ejemplo: Si V es

V = [ 3 
     2 
     1 
     4] 

La matriz de indicadores debe ser

M= [ 0 0 1 0 
    0 1 0 0 
    1 0 0 0 
    0 0 0 1] 

Respuesta

28

Lo que pasa una matriz de indicadores de este tipo, es que es mejor si se hace escasa. Casi siempre harás una matriz multiplicada con ella de todos modos, así que haz que la multiplicación sea eficiente.

n = 4; 
V = [3;2;1;4]; 
M = sparse(V,1:n,1,n,n); 
M = 
    (3,1)  1 
    (2,2)  1 
    (1,3)  1 
    (4,4)  1 

Si insiste en que M es una matriz completa, a continuación, por lo que es por lo que es sencillo después de los hechos, mediante el uso de la plena.

full(M) 
ans = 
    0  0  1  0 
    0  1  0  0 
    1  0  0  0 
    0  0  0  1 

Aprende a usar matrices dispersas. Ganarás mucho al hacerlo. Es cierto que para una matriz de 4x4, dispersa no ganará mucho. Pero los casos de ejemplo nunca son su verdadero problema. Supongamos que n fuera realmente 2000?

n = 2000; 
V = randperm(n); 
M = sparse(V,1:n,1,n,n); 
FM = full(M); 

whos FM M 
    Name   Size     Bytes Class  Attributes 

    FM  2000x2000   32000000 double    
    M   2000x2000    48008 double sparse  

Las matrices dispersas no ganan solo en términos de memoria utilizada. Compare el tiempo requerido para una sola matriz multiplicada.

A = magic(2000); 

tic,B = A*M;toc 
Elapsed time is 0.012803 seconds. 

tic,B = A*FM;toc 
Elapsed time is 0.560671 seconds. 
1

Desea crear la matriz de índice para que sea dispersa por el bien de la memoria. Es tan fácil como:

vSize = size(V); 
Index = sparse(vSize(1),max(V)); 
for i = 1:vSize(1) 
    Index(i, v(i)) = 1; 
end 

He utilizado este mismo, disfrutar :)

0
M=sparse(V,1:size(V,1),1)'; 

producirá una matriz dispersa que se puede utilizar en los cálculos como versión completa. Puede usar lleno (M) para "inflar" M para almacenar realmente ceros.

6

una forma rápida de hacer esto - si usted no requiere matriz dispersa - es crear una matriz de identidad, de tamaño mínimo al máximo (v), a continuación, para crear su matriz de indicadores mediante la extracción de los índices de v:

m = max(V); 
I = eye(m); 
V = I(V, :); 
+0

¿me puede explicar la tercera línea de su código? – Tarun

1

Aquí hay otro enfoque, similar a sparse pero con accumarray:

V = [3; 2; 1; 4]; 
M = accumarray([(1:numel(V)).' V], 1); 
1

simplemente puede combinar el índice de columna en V con un índice de la fila para crear un linear index, a continuación, utilizar eso para llenar M (inicializado a ceros):

M = zeros(numel(V), max(V)); 
M((1:numel(V))+(V.'-1).*numel(V)) = 1; 
Cuestiones relacionadas