2016-04-02 13 views
1

Zum Beispiel, wenn ich eine 10×10 Matrix habe, und ich habe eine Liste von n Koordinaten in dieser Matrix, würde ich gerne eine 3×3 Region um jede Koordinate nehmen, Größe ändern, um eine Länge 9 Vektor zu sein, und dann alle stapeln Vektoren in eine 9×n Matrix. Ich weiß, ich könnte eine For-Schleife schreiben, um das zu tun, aber das scheint ekelhaft, obwohl wahrscheinlich, was ich am Ende tun werde.Ist es möglich, mehrere lokale Regionen in einer Matrix in eine neue Matrix umzuwandeln?

+0

erster Gedanke: Sie können eine Schleife schreiben, die 'n' mal anstelle von' 10 * 10' Zeiten läuft. Die Anzahl der Koordinaten wird mit Sicherheit geringer sein als '10 * 10' (oder die Anzahl der Elemente in Ihrer Matrix). Dies spart etwas Rechenzeit, da Sie so ziemlich jede andere Aufgabe vektorisieren können. Im Pseudocode wäre etwas wie 'für i = 1: n; extrahiere 3x3 Region umgebende Koordinate * i *; Verkettungsmatrix " – Alessiox

Antwort

1

Unter der Annahme, dass die Koordinaten bereits in Indexform sind, könnten Sie verwenden:

m = 10; 
A = rand(m); 
cc = [23; 47; 64]; 
ind = bsxfun(@plus, [(-1:1) - m, (-1:1), (-1:1) + m], cc); 
newVals = A(ind); 

Oder konvertieren Koordinaten in Indexform:

c1 = [3 3; 7 5; 4 7]; 
cc = sub2ind(size(A), c1(:,1), c1(:,2)); 

Natürlich ist dies nicht überprüft, für Koordinaten an den Rändern der Matrix sein, und es wird einen Fehler werfen, wenn eine der Koordinaten ist.

2

Ich bin mir nicht sicher, ob dies mehr performant als eine for-Schleife ist, aber Sie könnten es tun, einige Berechnungen für die Indexwerte.

data = magic(5); 

%//  17 24  1  8 15 
%//  23  5  7 14 16 
%//  4  6 13 20 22 
%//  10 12 19 21  3 
%//  11 18 25  2  9 

%// The coordinates you want to sample at (row, col) 
coords = [2 3; 3 2; 2 4]; 

%// Determine the row and column offsets to apply for a 3x3 block 
[rowOffset, colOffset] = ndgrid(-1:1,-1:1); 

%// Compute the rows and columns included in each block centered t each point 
rows = bsxfun(@plus, coords(:,1).', rowOffset(:)); 
cols = bsxfun(@plus, coords(:,2).', colOffset(:)); 

%// Convert to absolute linear index and sample data at these regions 
newdata = data(sub2ind(size(data), rows, cols)); 

%// 24 23  1 
%// 5  4  7 
%// 6 10 13 
%// 1  5  8 
%// 7  6 14 
%// 13 12 20 
%// 8  7 15 
%// 14 13 16 
%// 20 19 22 

aber sagen, dass je nachdem, was Sie wollen, mit jeder dieser Gruppen zu tun, Sie könnte möglicherweise Faltung oder etwas verwenden, das Gleiche zu erreichen.

Verwandte Themen