2016-08-02 74 views
1

我需要做的是,給定一個標籤矢量(數字1到k),構造一個矩陣Y,這樣每列就是一個布爾矢量,表示每個標籤是否在Y與該列的索引相匹配。Matlab中以下循環的矢量化版本

例如,如果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_classesnum_samples很大。有什麼方法可以對此進行矢量化嗎?

+0

? – beaker

+0

Matlab版本2015a –

回答

3

你可以做到這一點使用bsxfun

num_classes = 10; 
num_samples = 100; 
labels = randi(num_classes, [num_samples, 1]); % Example 

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

或者,如果你有2016B(或八度),你可以做到這一點使用隱式廣播

Y = labels == 1:num_classes 
0

如果你有神經網絡工具箱,你可以使用ind2vec

Y = full(ind2vec(labels, num_classes))' 
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)); 

給您正在使用什麼版本的MATLAB的理想結果

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