我有一个向量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);
的反转。
有一个简单的单行技巧吗?如果没有,我如何同时迭代两个数组?
答案 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)
我不确定您是否要在y1
或y2
中执行此操作。无论如何,试试这个(例如在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