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?
1
A
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
- 1. jede dritte Zeile einer Matrix in eine neue Matrix setzen
- 2. Matrixwert effizient in eine neue Matrix kopieren
- 3. Ist es möglich, Zählerwerte innerhalb einer Matrix zu berechnen?
- 4. Erstellen neue Matrix von Datenrahmen und Matrix in Pandas
- 5. Einfügen einer Matrix in eine andere Matrix mit Matlab
- 6. before_install in einer Build-Matrix
- 7. Konvertieren einer dünn besetzten Matrix in eine vollständige Matrix - R
- 8. Verschiebungswert in einer Matrix
- 9. Konvertieren Sie mehrere Elemente einer Liste in eine Matrix R
- 10. Ist es möglich, in Matlab eine Referenz auf eine Matrix zu bekommen?
- 11. Was ist eine "Matrix" für in Raphael
- 12. Gründe, warum das Multiplizieren einer symmetrischen Matrix mit einer diagonalen Matrix eine unsymmetrische Matrix ergibt
- 13. Senden des Inhalts einer Matrix in einer Funktion an eine Matrix in einer anderen Funktion
- 14. eine Funktion Generieren einer Matrix in R
- 15. Ist es möglich, lokale Typen in F #
- 16. hinzufügen 2D-Matrix in 3D-Matrix
- 17. R eine Matrix in einer Schleife füllen
- 18. eine Matrix von Listen zu einer regelmäßigen Matrix
- 19. Konvertieren eine Liste der 3D-Matrix in 4D Matrix
- 20. "Vorberechnung" einer Matrix in mathprog
- 21. Detecting Diagonalen in einer Matrix
- 22. Eine Matrix nach einer primären Matrix neu anordnen
- 23. Create Matrix mit Diagonalelement ist Matrix in r
- 24. Inverse einer Matrix in R
- 25. Mehrere Indizes aus einer Matrix herausziehen
- 26. Werte in einer Matrix ändern
- 27. Erweitern einer 2D-Matrix auf eine 3D-Matrix von
- 28. Ist es möglich, das komplexe SQL in Rails umzuwandeln?
- 29. Lösen einer Matrix in MATLAB?
- 30. Inverse einer Matrix in SymPy?
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