2009-12-19 26 views
5

Ich möchte einen Vektor von Elementen einer Matlab-Matrix an vordefinierten Positionen erhalten. Zum Beispiel habe ich folgendesKonvertieren einer Matlab-Matrix in einen Vektor

>> i = [1,2,3]; 
>> j = [1,3,4]; 
>> A = [1,2,3,4; 5,6,7,8; 9,10,11,12; 13,14,15,16] 

A = 

    1  2  3  4 
    5  6  7  8 
    9 10 11 12 
    13 14 15 16 

Ich möchte einen Vektor, der mir die Werte von A an den Standorten correspongin zu i,j geben. Ich versuchte

aber das ist nicht was ich wollte. Ich möchte Folgendes erhalten:

>> [A(i(1),j(1)); A(i(2),j(2));A(i(3),j(3))] 

ans = 

    1 
    7 
    12 

Was ist die Matlab-Syntax dafür? Bitte vermeiden Sie Vorschläge für Schleifen oder irgendetwas, das nicht vektorisiert ist, da dies schnell erledigt werden muss. Hoffentlich wird es eine eingebaute Funktion geben.

Antwort

4

es auf dem schnellsten Weg zu bekommen, verwendet lineare Indizierung:

A((j-1)*size(A,1)+i) 

daran erinnern, dass MATLAB einen Spalte-Großauftrag verwendet.

0

Denn jetzt bin ich mit dieser:

>> diag(A(i,j)) 

ans = 

    1 
    7 
    12 
+3

Während dies funktioniert, ist es eine schlechte Wahl im Allgemeinen, da es zuerst erstellt eine neue 3x3-Matrix im Speicher, dann wirft es die meisten dieser Matrix in den Bit-Eimer mit der Diag-Funktion. Wenn Ihre Arrays und die Liste der Punkte in (i, j) überhaupt groß wären, wäre der Diag-Trick ziemlich ineffizient. –

3
A(sub2ind(size(A),i,j)) 

Wenn Sie wirklich Geschwindigkeit sehnen, können Sie versuchen, Ihre eigene Kopie von sub2ind.m machen, dass die alle Streifen aus Input-Überprüfung, dass diese Funktion tut.

2

Um zu verstehen, wie dies zu tun ist, ist es am besten zu verstehen, wie Matlab seine Arrays speichert. In der Matrix:

i = [1,2,3]; 
j = [1,3,4]; 
A = [1,2,3,4; 5,6,7,8; 9,10,11,12; 13,14,15,16] 

Matlab speichert die Elemente, die die Spalten hinunter gehen. So befinden sie sich tatsächlich in Speicher in der Reihenfolge:

{1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16} 

Sie können ein 2-d-Array tatsächlich indizieren, das einen EINZIGEN Index verwendet. Deshalb funktioniert der Sub2ind-Trick. Da die Elemente, die Sie am 1., 10. und 15. Elemente sind erhalten möchten, wie es in einer spaltenweise Anordnung gespeichert,

singleIndex = [1 10 15]; 
A(singleIndex) 
ans = 
    1  7 12 

Um diesen sub2ind diesen Index Liste gab zu bestätigen, versuchen Sie es ...

ind = sub2ind([4 4],i,j) 
ind = 
    1 10 15 
Verwandte Themen