2010-03-12 9 views
7

Ich habe ein 2D-Array, nennen Sie es "A". Ich habe zwei andere 2D-Arrays, nenne sie 'ix' und 'iy'. Ich möchte ein Ausgabearray erstellen, dessen Elemente die Elemente von A an den Indexpaaren sind, die von x_idx und y_idx bereitgestellt werden. Ich kann mit einer Schleife dazu wie folgt vor:zwei Arrays definieren 2D-Koordinaten, als Array-Indizes, in Matlab/Oktave


for i=1:nx 
    for j=1:ny 
     output(i,j) = A(ix(i,j),iy(i,j)); 
    end 
end 

Wie kann ich dies tun, ohne die Schleife? Wenn ich output = A (ix, iy), bekomme ich den Wert von A über den gesamten Bereich von (ix) X (iy).

Danke, Jason

+0

Vorsicht - Sie verwenden das ix-Array, um die y-Koordinate bereitzustellen, und das iy-Array, um das x bereitzustellen. In MATLAB ist der erste Index die y-Koordinate. Das gleiche gilt für Ihre Ausgangsmatrix - Sie verwenden die falschen Grenzen für die for-Schleifen. –

+0

Guter Punkt, aber es hängt ein wenig davon ab, wie er die Daten verwendet. Wenn es ihm egal ist, dass das Anzeigen seiner Matrix x von oben nach unten und von links nach rechts zeigt, gibt es kein grundlegendes Problem, wenn man von dieser Matlab-Konvention abweicht. Aber es ist wichtig zu wissen, stimme ich zu. –

Antwort

11

Ein schneller Weg ist lineare Indizierung direkt SUB2IND ohne Aufruf zu verwenden:

output = A(size(A,1)*(iy-1) + ix) 

... denken Sie an die Matrix A als 1D-Array (spaltenweise Reihenfolge)

+0

Wow, das ist viel schneller! Vielen Dank. – Jason

+2

@Jacob: Eigentlich denke ich, dass "output" die gleiche Größe wie 'ix' hat. – gnovice

+0

Intelligente Antwort! Vielen Dank. –

2

Dies ist die einzeilige Methode, die für große Matrizen

reshape(diag(A(ix(:),iy(:))),[ny nx]) 

Eine klarere und effizientere Methode wäre, sub2ind zu verwenden nicht sehr effizient ist. Ich habe für Situationen igitt Kommentar aufgenommen (wie Sie), wenn ix und iy die gleiche Anzahl von Elementen haben:

newA = A(sub2ind(size(A),ix,iy)); 

Auch nicht zu verwechseln x und y für i und j in Notation - j und x allgemein repräsentieren Spalten und i und y repräsentieren Zeilen.

+0

Mann, Entschuldigung für alle Änderungen! Ich denke heute nicht klar. – Jacob

+2

Der sub2ind-Code kann einfach sein: newA = A (sub2ind (Größe (A), ix, iy)); – yuk

+0

Perfekt! Vielen Dank! – Jason