我需要做的是,给定一个标签向量(数字1到k),构造一个矩阵Y
,使每列都是一个布尔向量,表示{{1}中的每个标签是否都是}匹配该列的索引。
例如,如果Y
则labels = [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
非常大时可能会很慢。有没有办法对此进行矢量化?
答案 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