我正在尝试对以下MATLAB操作进行矢量化:
给定一个带索引的列向量,我想要一个带相同行数的列和固定列数的列。这个矩阵用零初始化,并在位置中包含1由索引指定。
以下是我已经编写的脚本示例:
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
期望的结果是:
yvec =
1 0 0
0 0 1
0 1 0
1 0 0
0 0 1
如果没有for循环,是否可以获得相同的结果?我试过这样的东西:
% Vectorization (?)
yvec2 = zeros(m, 3);
yvec2(:, y(:)) = 1;
但它不起作用。
这里可以使用两种方法。
方法1:
y = [1; 3; 2; 1; 3];
yvec = zeros(numel(y),3);
yvec(sub2ind(size(yvec),1:numel(y),y'))=1
进近2(一列):
yvec = bsxfun(@eq, 1:3,y)
另一种方法:
yvec = full(sparse(1:numel(y),y,1));
您可以使用accumarray
:
yvec = accumarray([(1:numel(y)).' y], 1);
我是这样做的:
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