在由向量索引位置创建一个零填充二维数组与那些

Muf*_*ffo 8 matlab vectorization octave

我正在尝试向量化以下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
Run Code Online (Sandbox Code Playgroud)

期望的结果是:

yvec =

 1     0     0
 0     0     1
 0     1     0
 1     0     0
 0     0     1
Run Code Online (Sandbox Code Playgroud)

没有for循环可以实现相同的结果吗?我试过这样的事情:

% Vectorization (?)
yvec2 = zeros(m, 3);
yvec2(:, y(:)) = 1;
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

Div*_*kar 8

您可以在这里使用两种方法.

方法1:

y = [1; 3; 2; 1; 3];
yvec = zeros(numel(y),3);
yvec(sub2ind(size(yvec),1:numel(y),y'))=1
Run Code Online (Sandbox Code Playgroud)

方法2(单线):

yvec = bsxfun(@eq, 1:3,y)
Run Code Online (Sandbox Code Playgroud)

  • 另外看起来`yvec`的列数等于`y`的最大值,所以对于第二种方法,你可以得到一个通用版本`yvec = bsxfun(@eq,1:max(y),y)`. (3认同)

Lui*_*ndo 5

另一种方法:

yvec = full(sparse(1:numel(y),y,1));
Run Code Online (Sandbox Code Playgroud)