2012-03-30 17 views
6

Voglio convertire un vettore di indici in una matrice con quelli nelle colonne degli indici.Converti vettore di indici in matrice

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

possibile duplicato di [Come posso modificare i valori di più punti in una matrice?] (Http://stackoverflow.com/questions/6850368/how-can-i-change-the-values-of-multiple- punti-in-a-matrice) – gnovice

risposta

3

Un modo è quello di utilizzare la funzione 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

avevo una domanda molto simile, quindi non ho voleva aprire uno nuovo. Volevo convertire un vettore di riga di indici in una matrice con quelli nelle righe (anziché nelle colonne) degli indici. Avrei potuto usare la risposta precedente e invertirla, ma pensavo che avrebbe funzionato meglio con matrici molto grandi.

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

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

non ho potuto vedere come usare sub2ind per raggiungere questo obiettivo, così ho calcolato io stesso.

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

Ho testato la funzione sub2ind, ma sul forum Coursera Machine Learning mi è stato fatto a questa bellezza.

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

Utilizza la matrice identità per selezionare la colonna appropriata in base al valore in x.

0

È possibile utilizzare accumarray che rende questo molto facile, in questo modo:

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

La parte 1:length(x) specifica in cui righe quelli vanno e x in cui le colonne.

Problemi correlati