通过行和列上的谓词生成布尔矩阵

时间:2012-05-30 09:48:13

标签: matlab matrix octave

我有以下矢量:

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

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

6 个答案:

答案 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)')