2016-11-03 1 views
1

Ich versuche, Code zu schreiben, der die Elemente findet, die zu einem gegebenen Eintrag in einer Matrix orthogonal sind. Die Ausgabe muss beinhalten, was die Elemente selbst sind, ihre Indizes und der Algorithmus muss auch für die Kanten funktionieren. Zum BeispielEffiziente Methode zum Lokalisieren benachbarter Elemente in einer Matrix

A = [ 1 2 5 6 7 
     2 3 1 6 9 
     3 6 7 8 1 ] 

Dann betrachten, wenn ich die Elemente neben Eintrag (2,2) will, zurückkehren würde der Code:

[2,2,1,6] %-> these elements are orthogonal to entry (2,2) 
    [w,x,y,z] %-> where w,x,y,z correspond to the index of the orthogonal entries 
       %found (they can be linear indices or otherwise). 

So implementiert ich meine eigene Funktion, dies zu tun und gut, Ich habe gemerkt, dass es ziemlich schlimm ist. Es scheint nicht konsistent für die Kanten zu arbeiten (obwohl ich versuchen könnte, die Matrix aufzufüllen und zu sehen, ob das das Problem behebt - ich hatte noch keine Chance) und, was noch wichtiger ist: Mein Code läuft über die gesamte verdammte Matrix. Und so ist es sehr ineffizient. Ich habe mich gefragt, ob jemand eine schnelle und effiziente Möglichkeit hatte, das zu tun, was ich oben beschrieben habe? MATLAB scheint dafür keine Funktion zu haben - das habe ich überprüft.

Ich würde die Hilfe zu schätzen wissen.

+2

Ich bin nicht Verstehen, warum eine Schleife notwendig ist. Warum können Sie die grundlegende Indizierung nicht verwenden und nur die Kanten mit ein paar if-Anweisungen erfassen? – excaza

Antwort

1
for(int i = row-1; i <= row+1; i += 2) { 
    for(int j = col-1; j <= col+1; j += 2) { 
     if(row>=0 && col>=0 && row < MATRIX_SIZE && col < MATRIX_SIZE) 
      std::cout << mat[row, col]; 
    } 
} 

dies in einem Beispiel in C++. Die Ausgabe wird nicht sehr klar sein, aber dies ist nur ein Beispiel. Bei der Programmierung seiner angenommenen beginnen die Zeilen/Spalten in der Matrix von 0 (nicht 1), also in Ihrem Beispiel wird die Lösung, die Sie gaben, die Eingabe (1,1) und nicht (2,2) passen. Die Laufzeit ist natürlich O(1).

row = Argument gegebene Zeile (zum Beispiel 1)

col = Kolonne Argument angegeben (beispielsweise auch 1)

MATRIX_SIZE = die Größe der Matrix: wenn die Matrix nxn MATRIX_SIZE dann = n und der letzte Index in jeder Zeile/Spalte der Matrix ist n-1.

1

Wenn Ihre 2D-Matrix enthält Wdt Spalten und Zeilen Hgt, dann Indizes von Nachbarn von k-ten Element

top = k - Wdt  // if k > Wdt 
bottom = k + Wdt  // if k <= Wdt * Hgt - Wdt 
right = k + 1  // if (k - 1) mod Wdt > 0 
left = k - 1   // if (k - 1) mod Wdt < Wdt - 1 

if-Ausdrücke dazu bestimmt sind, off-Kante ausschließen Elemente

Verwandte Themen