2012-03-30 29 views
6

Chcę przekonwertować wektor indeksów na macierz z wartościami w kolumnach indeksów.Konwersja wektora indeksów w macierz

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

możliwy duplikat [Jak mogę zmienić wartości wielu punktów w macierzy?] (Http://stackoverflow.com/questions/6850368/how-can-i-change-the-values-of-multiple- point-in-a-matrix) – gnovice

Odpowiedz

3

Jednym ze sposobów jest wykorzystanie funkcji 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

miałem bardzo podobne pytanie, więc nie ma otworzyć nowy. Chciałem przekształcić wektor wierszy indeksów w macierz z wierszami (zamiast kolumn) indeksów. Mógłbym użyć poprzedniej odpowiedzi i odwrócić ją, ale myślałem, że to będzie lepiej z bardzo dużymi matrycami.

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

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

Nie mogłem zobaczyć, jak użyć sub2ind, aby to osiągnąć, więc sam to obliczyłem.

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

Testowałem funkcję sub2ind, ale na forum Coursera Machine Learning zostałem wskazany na to piękno.

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

Używa macierzy tożsamości, aby wybrać odpowiednią kolumnę na podstawie wartości na x.

0

Można użyć accumarray co sprawia, że ​​to bardzo łatwe, jak w przykładzie:

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

1:length(x) część określa się, które wiersze te iść i x do której kolumny.