2012-03-30 6 views
6

Quiero convertir un vector de índices en una matriz con los que están en las columnas de los índices.Convertir el vector de índices en la matriz

x = [2;1;3;1]; 
m = someFunc(x,3) 
% m = 
% 
% 0 1 0 
% 1 0 0 
% 0 0 1 
% 1 0 0 
+0

posible duplicado de [¿Cómo puedo cambiar los valores de varios puntos en una matriz?] (Http://stackoverflow.com/questions/6850368/how-can-i-change-the-values-of-multiple- puntos en una matriz) – gnovice

Respuesta

3

Una forma es utilizar la función SUB2IND:

colN = 3; 
assert(max(x)<=colN,'Not enough columns') %# check that you have enough columns 
%# other checks that x is valid indices 

m = zeros(numel(x),colN); 
m(sub2ind(size(m),1:numel(x),x')) = 1; 
1

que tenía una pregunta muy similar, por lo que no querían abrir una nueva. Quería convertir un vector de fila de índices en una matriz con los que están en las filas (en lugar de columnas) de los índices. Pude haber usado la respuesta anterior e invertirla, pero pensé que funcionaría mejor con matrices muy grandes.

octave> x = [2 1 3 1]; 
octave> m = setRowsToOne(x, 3) 
m = 

    0 1 0 1 
    1 0 0 0 
    0 0 1 0 

no pude ver cómo utilizar sub2ind de lograr esto, por lo que se calcula que a mí mismo.

function matrixResult = setRowsToOne(indexOfRows, minimumNumberOfRows) 
    numRows = max([indexOfRows minimumNumberOfRows]); 
    numCols = columns(indexOfRows); 
    matrixResult = zeros(numRows, numCols); 
    assert(indexOfRows > 0, 'Indices must be positive.'); 
    matrixResult(([0:numCols-1]) * numRows + indexOfRows) = 1; 
end 

x = [2 1 3 1]; 
m = setRowsToOne(x, 3) 
15

Probé la función sub2ind, pero en el foro de machine learning de Coursera me señalaron esta belleza.

m = eye(num_cols)(x,:); 

Utiliza la matriz de identidad para seleccionar la columna adecuada en función del valor en x.

0

Puede utilizar accumarray que hace esto muy fácil, así:

accumarray([ (1:length(x))', x ], 1, [4, 3]) 

La parte 1:length(x) especifica en las filas que los van, y en la que x columnas.

Cuestiones relacionadas