2016-08-02 21 views
1

Was ich tun muss, ist, gegeben einen Vektor von Etiketten (Zahlen 1 bis k), konstruieren Sie eine Matrix Y so dass jede Spalte ein boolescher Vektor darstellt, ob oder nicht jedes Etikett in Y entspricht dem Index dieser Spalte.Vektorisierte Version der folgenden Schleife in Matlab

Zum Beispiel, wenn labels = [1 2 3 4] dann Y wäre:

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

Bisher ist mein Code dies:

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 

Dieser irgendwie funktioniert, aber es kann sehr langsam sein, wenn num_classes oder num_samples sehr groß. Gibt es eine Möglichkeit, dies zu vektorisieren?

+0

Welche Version von MATLAB verwenden Sie? – beaker

+0

Matlab Version 2015a –

Antwort

3

Sie können dies mit bsxfun

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

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

Oder, wenn Sie 2016b (oder Octave) Sie können es tun impliziten Rundfunk mit

Y = labels == 1:num_classes 
0

Wenn Sie das neuronale Netzwerk-Toolbox haben könnten Sie ind2vec verwenden:

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

Hier ist ein weiterer Ansatz. Lassen Sie uns einige Beispieldaten definieren:

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

Dann

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

gibt das gewünschte Ergebnis

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