2016-08-02 5 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_classesまたはnum_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 
関連する問題