Matlab

时间:2016-08-02 17:55:18

标签: arrays matlab vectorization

我需要做的是,给定一个标签向量(数字1到k),构造一个矩阵Y,使每列都是一个布尔向量,表示{{1}中的每个标签是否都是}匹配该列的索引。

例如,如果Ylabels = [1 2 3 4]为:

Y

到目前为止,我的代码是:

[ [ 1  0  0  0]
  [ 0  1  0  0]
  [ 0  0  1  0]
  [ 0  0  0  1] ]

这种方法有效但num_classes = 10; num_samples = 100; labels = randi(num_classes, [num_samples, 1]); % Example Y = zeros([num_samples, num_classes]); for k = 1:num_classes Y(:, k) = (y == k); end num_classes非常大时可能会很慢。有没有办法对此进行矢量化?

3 个答案:

答案 0 :(得分:3)

您可以使用bsxfun

执行此操作
num_classes = 10;
num_samples = 100;
labels = randi(num_classes, [num_samples, 1]);   % Example

Y = bsxfun(@eq, labels, 1:num_classes);

或者,如果你有2016b(或Octave),你可以使用隐式广播

Y = labels == 1:num_classes

答案 1 :(得分:0)

如果你有神经网络工具箱,你可以使用ind2vec

Y = full(ind2vec(labels, num_classes))'

答案 2 :(得分:0)

这是另一种方法。让我们定义一些示例数据:

num_classes = 5;
num_samples = 10;
labels = [3 5 3 5 3 2 4 4 4 2];

然后

Y = full(sparse(1:num_samples, labels, 1, num_samples, num_classes));

给出了期望的结果

Y =
     0     0     1     0     0
     0     0     0     0     1
     0     0     1     0     0
     0     0     0     0     1
     0     0     1     0     0
     0     1     0     0     0
     0     0     0     1     0
     0     0     0     1     0
     0     0     0     1     0
     0     1     0     0     0