2016-09-21 2 views
2

Ich habe a MatrixWie ändert man Elemente einer Matrix mit Bezug auf einen Vektor von Spaltenindizes ohne For-Schleife?

a = 

    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 

und b Vektor

b = 

    1 2 3 4 5 5 

Ich mag Wert jeder Zeile mit Referenzwert von b Matrixwert in a Matrix ersetzen, und schließlich eine Matrix zu erzeugen, wie folgt, ohne die Verwendung von für die Schleife.

a_new = 

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

wenn erstes Element b, b(1) = 1 so nimmt erste Reihe von a Vektors ändern und als erstes Element 1, da b(1) = 1 machen.

Wie kann ich dies ohne die Verwendung von for-Schleife implementieren?

+0

Mögliche Duplikat [Erstellen Indicator Matrix] (http://stackoverflow.com/questions/6150174/creating-indicator-matrix) – carandraug

Antwort

3

Sicher. Sie brauchen nur einen linear index von b zu bauen und es verwenden, um die Werte in a zu füllen:

a = zeros(6,5); % original matrix 
b = [1 2 3 4 5 5]; % row or column vector with column indices into a 
ind = (1:size(a,1)) + (b(:).'-1)*size(a,1); % build linear index 
a(ind) = 1; % fill value at those positions 
+0

Wie kann ich gleiche implementieren, wenn b Zeilenvektor ist? – manoos

+0

Was meinst du? 'b' _ist_ ein Zeilenvektor in meinem Beispiel und in Ihrer Frage. Meinst du eine Spalte? Was sollte das Ergebnis sein? –

+0

Sorry Spaltenvektor. In Wirklichkeit ist 'a' eine Matrix der Größe 5000x10 und 'b' ist ein Vektor mit der Größe 5000x1 – manoos

0

jedes dieser Verfahren arbeitet in Octave:

bsxfun(@eq, [1:5 5]',(1:5)) 

[1:5 5].' == (1:5) 
1

auch über den Index auf Indizes Umwandlung Art und Weise,

a = zeros(6,5); 
b = [1 2 3 4 5 5]; 
idx = sub2ind(size(a), [1:6], b); % 1:6 just to create the row index per b entry 
a(idx) = 1 
2

Gleiche wie Luis Mendo's answer, aber mit der speziellen Funktion sub2ind:

a(sub2ind(size(a),(1:numel(b)).',b(:))) = 1 
+0

Wie kann ich dasselbe implementieren, wenn b Zeilenvektor ist? – manoos

+0

@manoos Ersetzen Sie einfach 'b' durch' b (:). '' –

+0

@manoos Ich habe eine robustere Version hinzugefügt – thewaywewalk

Verwandte Themen