Crea una matriz 2D llena de cero con las que están en las posiciones indexadas por un vector

Estoy tratando de vectorizar la siguiente operación de MATLAB:

Dado un vector de columna con índices, quiero una matriz con el mismo número de filas de la columna y un número fijo de columnas. La matriz se inicializa con ceros y contiene unos en las ubicaciones especificadas por los índices.

Aquí hay un ejemplo de la secuencia de comandos que ya he escrito:

y = [1; 3; 2; 1; 3]; m = size(y, 1); % For loop yvec = zeros(m, 3); for i=1:m yvec(i, y(i)) = 1; end 

El resultado deseado es:

 yvec = 1 0 0 0 0 1 0 1 0 1 0 0 0 0 1 

¿Es posible lograr el mismo resultado sin el bucle for? Intenté algo como esto:

 % Vectorization (?) yvec2 = zeros(m, 3); yvec2(:, y(:)) = 1; 

pero no funciona.

Dos enfoques que puedes usar aquí.

Enfoque 1:

 y = [1; 3; 2; 1; 3]; yvec = zeros(numel(y),3); yvec(sub2ind(size(yvec),1:numel(y),y'))=1 

Enfoque 2 (One-liner):

 yvec = bsxfun(@eq, 1:3,y) 

Sin embargo, otro enfoque:

 yvec = full(sparse(1:numel(y),y,1)); 

Puedes hacer esto con accumarray :

 yvec = accumarray([(1:numel(y)).' y], 1); 

Lo hice de esta manera:

 classes_count = 10; sample_count = 20; y = randi([1 classes_count], 1, sample_count); y_onehot = zeros(classes_count, size(y, 2)); idx = sub2ind(size(y_onehot), y, [1:size(y, 2)]); y_onehot(idx) = 1