2012-05-19 6 views
5

Ich habe einen m -dimensionalen Vektor von ganzen Zahlen im Bereich von 1 bis n. Diese Ganzzahlen sind Spaltenindizes für m × n Matrix.Erstellen einer m-n-Matrix von 0s und 1s aus dem m-großen Vektor von Spaltenindizes

Ich mag eine m × n Matrix von 0 und 1 zu schaffen, wobei in m -ten Zeile ein 1 in der Spalte, die von m -te Wert in meinem Vektor spezifiziert ist.

Beispiel:

% my vector (3-dimensional, values from 1 to 4): 
v = [4; 
    1; 
    2]; 

% corresponding 3 × 4 matrix 
M = [0 0 0 1; 
    1 0 0 0; 
    0 1 0 0]; 

Ist dies möglich, ohne eine for-Schleife?

Antwort

4

Natürlich, das ist, warum sie sparse Matrizen erfunden:

>> M = sparse(1:length(v),v,ones(length(v),1)) 
M = 

    (2,1)  1 
    (3,2)  1 
    (1,4)  1 

, die Sie auf eine vollständige Matrix konvertieren können, wenn Sie mit full wollen:

>> full(M) 
ans = 

    0  0  0  1 
    1  0  0  0 
    0  1  0  0 
3

oder ohne Sparse Matrix:

>> M = zeros(max(v),length(v)); 
>> M(v'+[0:size(M,2)-1]*size(M,1)) = 1; 
>> M = M' 

M = 

0  0  0  1 
1  0  0  0 
0  1  0  0 

Transposition wird verwendet, weil in Matlab-Arrays durch Spalten

3

In Octave, zumindest von 3.6.3 adressiert sind, können Sie diese einfach mit Rundfunk tun:

M = v==1:4