Кодирование 1 из K в октаве

Я пытаюсь получить двоичное кодирование целочисленного вектора one-of-K в Octave. У меня есть вектор y, скажем

y = [1 ; 2 ; 3 ; 1 ; 3]

и я хочу матрицу

Y = [1 0 0
     0 1 0
     0 0 1
     1 0 0
     0 0 1]

Я могу построить матрицу one-of-K вручную с помощью

Y = [];
Y = [Y y == 1];
Y = [Y y == 2];
Y = [Y y == 3];

Но когда я пытаюсь построить его с помощью цикла for,

Y = [];
for i = unique(y),
    Y = [Y y == i];
endfor

что-то идет не так:

error: mx_el_eq: nonconformant arguments (op1 is 5x1, op2 is 3x1)

Я даже не понимаю сообщение об ошибке. Где моя ошибка?


person Fred Foo    schedule 05.11.2011    source источник


Ответы (2)


Я думаю, что есть способ сделать это без цикла:

Y = unique(y)(:,ones(1,size(y,1)))' == y(:,ones(size(unique(y),1),1))
person Devin    schedule 07.11.2011
comment
Спасибо, что поймали это. Я исправил это, чтобы сказать y вместо t. - person Devin; 29.11.2011
comment
Бедный старый Octave, вынуждающий нас обменивать чрезмерное использование памяти на производительность в отсутствие jit. - person Kuba hasn't forgotten Monica; 04.06.2012

Хорошо, нашел. Я хотел бы, чтобы учебник сказал мне это.

Y = [];
for i = unique(y)',
%                ^
%  -------------/
    Y = [Y y == i];
end

По-видимому, for перебирает столбцы вектора слева направо, а unique возвращает вектор-столбец, поэтому «несовместимые аргументы» — это y (5×1) и unique(y). (3×1).

person Fred Foo    schedule 05.11.2011