2016-06-14 6 views
1

y - вектор-столбец с целыми значениями обозначают номер метки (например, между 1-3). Теперь мне нужно создать матрицу с таким же числом строк y. Каждая строка i теперь представляет собой вектор с элементом y(i), который должен быть 1, а остальные - 0.Создайте матрицу с единицами в определенных столбцах

Пример:

y = [3, 2, 2]'; 

x = [0,0,1; 
    0,1,0; 
    0,1,0]; 

Есть ли эффективный способ, чтобы закончить эту работу. Я знаю, что цикл будет делать:

x = zeros(size(y, 1), 3) 
for i = 1:size(y, 1) 
    x(i, y(i)) = 1 
end 
+0

Вот точная копия: http://stackoverflow.com/questions/23078287/create-a-zeros-filled-2d-array-with-ones-at-positions-indexed-by-a-vector – Divakar

+0

@ Divakar Ничего себе еще не видел этого дурака. Мне нравится «редкое» решение. Очень умно. – Suever

+0

Да, как оказалось, у нас была целая цепочка для этой конкретной проблемы. Если я правильно помню, этот разреженный был наиболее эффективным. – Divakar

ответ

3

Вы можете легко сделать это с помощью sub2ind, который преобразует индексы линейных индексов. Нижние индексы строк: 1:numel(y), а ваши индексы столбца - значения y.

x = zeros(numel(y), max(y)); 
x(sub2ind(size(x), 1:numel(y), y(:).')) = 1; 

Или вы можете просто сделать это с небольшой математикой индекса.

x = zeros(numel(y), max(y)); 
x(((y(:).' - 1) * numel(y)) + (1:numel(y))) = 1; 
+0

Спасибо, вот что мне нужно. –

Смежные вопросы