我有以下矢量:
y = [1; 3; 2; 3; 1];
其所有值均介于1
和n
之间(在本例中为3
),并表示不同的选项。
我想创建一个大小为size(y, 1)
x n
的矩阵,其行与y
值相对应:
1 0 0 % because y(1) = 1
0 0 1 % because y(2) = 3
0 1 0 % because y(3) = 2
0 0 1
1 0 0
这样做的一种方法是
Y = zeros(size(y, 1), num_labels);
for i = 1:m
Y(i, y(i)) = 1;
end
有没有更好的方法来做到这一点,也许是在一个表达式中?
基本上,我需要的是生成一个带有布尔谓词(i, j) => j == y(i)
的矩阵。
答案 0 :(得分:7)
如果a
是列向量
a = [1; 3; 2; 3; 1];
bsxfun(@eq, a, [1:max(a)])
如果它是行向量
a = [1; 3; 2; 3; 1]';
bsxfun(@eq, a', [1:max(a)])
答案 1 :(得分:5)
如果您可以访问Statistics Toolbox,则命令dummyvar
可以完全满足您的需要。
>> y = [1; 3; 2; 3; 1];
>> dummyvar(y)
ans =
1 0 0
0 0 1
0 1 0
0 0 1
1 0 0
答案 2 :(得分:2)
初始化矩阵后,您可以使用sub2ind
,如下所示:
y = [1; 3; 2; 3; 1];
m = length(y);
n = max(y);
Y = zeros(m, n);
Y(sub2ind(size(Y), 1:m, y')) = 1
Y =
1 0 0
0 0 1
0 1 0
0 0 1
1 0 0
这里的诀窍是知道y
的相应行逐个从1
转到m
。
答案 3 :(得分:2)
accumarray([(1:length(y)).' y], 1)
答案 4 :(得分:2)
正如Dmitri Bouianov在Coursera讨论论坛上所建议的,这也有效:
Y = eye(num_labels)(y, :);
此解决方案使用y
的元素作为索引从标识矩阵中选择行。
答案 5 :(得分:1)
在Octave中(至少从3.6.3开始,不确定何时推出),您可以非常轻松地使用广播来完成此操作。它的工作原理如下:
Y = y==1:3
(如果y是一个行矩阵,你需要先调换它 - 如果你想改为换位,使用y ==(1:3)')