创建一个零填充的2D数组,其中一个位置由向量索引

时间:2014-04-15 08:27:06

标签: matlab octave vectorization

我正在尝试对以下MATLAB操作进行矢量化:

  

给定带索引的列向量,我想要一个矩阵   相同行数和固定数量的列。该   矩阵用零初始化并包含位置中的矩阵   由索引指定。

以下是我已编写过的脚本示例:

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;

但它不起作用。

4 个答案:

答案 0 :(得分:8)

您可以在此处使用两种方法。

方法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)

答案 1 :(得分:5)

又一种方法:

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

答案 2 :(得分:3)

您可以使用accumarray执行此操作:

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

答案 3 :(得分:0)

我是这样做的:

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