2016-08-02 4 views
1

Что мне нужно сделать, учитывая вектор меток (числа от 1 до k), постройте матрицу Y так, чтобы каждый столбец был булевым вектором, представляющим, каждая ли метка в Y соответствует индексу этой колонки.Векторизованная версия следующего цикла в Matlab

Например, если labels = [1 2 3 4] тогда Y будет:

[ [ 1 0 0 0] 
    [ 0 1 0 0] 
    [ 0 0 1 0] 
    [ 0 0 0 1] ] 

Пока мой код это:

num_classes = 10; 
num_samples = 100; 

labels = randi(num_classes, [num_samples, 1]); % Example 
Y = zeros([num_samples, num_classes]); 

for k = 1:num_classes 
    Y(:, k) = (y == k); 
end 

Это своего рода работает, но это может быть очень медленным, когда num_classes или num_samples очень большой. Есть ли способ векторизовать это?

+0

Какую версию MATLAB вы используете? – beaker

+0

Matlab версия 2015a –

ответ

3

Вы можете сделать это с помощью bsxfun

num_classes = 10; 
num_samples = 100; 
labels = randi(num_classes, [num_samples, 1]); % Example 

Y = bsxfun(@eq, labels, 1:num_classes); 

Или, если у вас есть 2016b (или октава), вы можете сделать это используя неявное вещание

Y = labels == 1:num_classes 
0

Если у вас есть нейронная сеть инструментов можно использовать ind2vec:

Y = full(ind2vec(labels, num_classes))' 
0

Вот еще один подход. Давайте определимся пример данных:

num_classes = 5; 
num_samples = 10; 
labels = [3 5 3 5 3 2 4 4 4 2]; 

Тогда

Y = full(sparse(1:num_samples, labels, 1, num_samples, num_classes)); 

дает желаемый результат

Y = 
    0  0  1  0  0 
    0  0  0  0  1 
    0  0  1  0  0 
    0  0  0  0  1 
    0  0  1  0  0 
    0  1  0  0  0 
    0  0  0  1  0 
    0  0  0  1  0 
    0  0  0  1  0 
    0  1  0  0  0 
Смежные вопросы