4

我有以下向量:

y = [1; 3; 2; 3; 1];

它的所有值都介于1n(在本例中为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

有没有更好的方法来做到这一点,也许在一个表达式中?
基本上,我需要的是生成一个带有 boolean predicate 的矩阵(i, j) => j == y(i)

4

6 回答 6

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)]) 
于 2012-05-30T10:17:52.777 回答
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
于 2012-05-30T12:03:31.167 回答
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从一个1m一个。

于 2012-05-30T10:02:14.100 回答
2
accumarray([(1:length(y)).' y], 1)
于 2012-05-30T13:29:43.300 回答
2

正如 Dmitri Bouianov 在 Coursera 讨论论坛上所建议的,这也有效:

Y = eye(num_labels)(y, :);

此解决方案使用 to 的元素y作为索引从单位矩阵中选择行。

于 2012-05-31T01:25:27.410 回答
1

在 Octave 中(至少从 3.6.3 开始,不确定何时引入),您可以使用广播非常轻松地做到这一点。它是这样工作的:

Y = y==1:3

(如果 y 是行矩阵,则需要先转置它 - 如果您想转置 Y,请使用 y==(1:3)')

于 2013-03-16T14:18:49.103 回答