我有索引的矢量。如何在每行的给定索引处设置一个?

时间:2014-04-19 14:40:08

标签: arrays matlab octave

我有一个向量y,其整数值从1到10:

octave> size(y)
ans =

   5000      1

我创建了zeros数组y1

octave> size(y1)
ans =

   5000     10

我需要在1的每一行中设置y2,索引等于y中的值。所以在第一行,当我有:

octave> y(1)
ans =  10

我需要:

octave> y1(1,:)
ans =

   0   0   0   0   0   0   0   0   0   1

我在代码的其他位置有[w, y] = max(y2, [], 2);的反转。

有一个简单的单行技巧吗?如果没有,我如何同时迭代两个数组?

3 个答案:

答案 0 :(得分:7)

你可以使用这个技巧

y1 = eye(10)(y,:);

或它是两步版

y1 = eye(10);
y1 = y1(y,:);

说明

在第一步中,您将创建一个单位矩阵

  >> y1 = eye(10)    

    y1 =    

 Diagonal Matrix

       1   0   0   0   0   0   0   0   0   0
       0   1   0   0   0   0   0   0   0   0
       0   0   1   0   0   0   0   0   0   0
       0   0   0   1   0   0   0   0   0   0
       0   0   0   0   1   0   0   0   0   0
       0   0   0   0   0   1   0   0   0   0
       0   0   0   0   0   0   1   0   0   0
       0   0   0   0   0   0   0   1   0   0
       0   0   0   0   0   0   0   0   1   0
       0   0   0   0   0   0   0   0   0   1

在第二步中,使用y作为缩进矩阵中的索引。这一步从字面矩阵中复制行并创建所需的矩阵。

>> y = [1,1,2,2,5,10,10];
>> y1 = y1(y,:)
y1 =

   1   0   0   0   0   0   0   0   0   0
   1   0   0   0   0   0   0   0   0   0
   0   1   0   0   0   0   0   0   0   0
   0   1   0   0   0   0   0   0   0   0
   0   0   0   0   1   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   1
   0   0   0   0   0   0   0   0   0   1

答案 1 :(得分:2)

我不确定您是否要在y1y2中执行此操作。无论如何,试试这个(例如在y1上):

y = randi(10,5000,1);
y1 = zeros(size(y,1), 10);
y1(sub2ind(size(y1), (1:size(y1,1))', y)) = 1;

答案 2 :(得分:1)

不知道单行技巧,但你可以在一个简单的循环中完成:

for i=1:length(y)
     y1(i,y(i))=1;
end