Konvertieren eines 2D-Arrays aus 2D-Arrays in ein einzelnes 2D-Array

8

Also habe ich ein Objekt namens mangels eines besseren Wortes, MatricesMatrix welches ein Matrix von Matrizen ist (alles wird als double[,] gespeichert). Ich möchte alle Werte aus den inneren Matrizen in eine große Matrix strippen. Hier ist, was ich bisher habe:

%Vor%

Beachten Sie, dass ich programmgesteuert die Gesamtanzahl der Zeilen und Spalten bestimmt habe, die die returnMatrix haben muss.

Hier sind einige weitere Richtlinien und Ausgabefälle:

  • Jedes Element der großen Matrix sollte sich in der gleichen Position befinden wie die anderen Elemente der großen Matrix, die aus der Matrix innerhalb der Matrizenmatrix stammen, aus der das Element stammt.
  • Jede "Matrix" (nicht mehr in Matrixform) innerhalb der großen Matrix sollte sich relativ zu den anderen Matrizen innerhalb der großen Matrix in der gleichen Position befinden wie in der MatricesMatrix (ohne Überlappung und 0 in alle leer gelassenen Räume).

CASE 1

Gegeben diese Eingabe: a MatricesMatrix(2,2) mit [0,0] = (2x2 matrix), [0,1] = (2x3 matrix), [1,0] = (2x2 matrix), and [1,1] = (2x3 matrix) . Das heißt,

Die Ausgabe muss lauten:

Fall 2

Gegeben diese Eingabe: a MatricesMatrix(2,2) mit [0,0] = (1x1 matrix), [0,1] = (3x3 matrix), [1,0] = (2x2 matrix), and [1,1] = (4x4 matrix) . Das heißt,

Die Ausgabe sollte etwa lauten:

Jede Hilfe wäre sehr willkommen!

UPDATE: Hier ist ein Komponententest für Fall 1, der bestanden werden sollte:

%Vor%     
Matt VS 10.07.2014, 13:49
quelle

3 Antworten

4

Ich habe mit einer einfachen Matrix-Klasse begonnen, die double[,] s enthält. Nichts Besonderes, nur ein einfaches Array-of-arrays mit einer Zeilen- und Spaltenanzahl und einem Array-Accessor.

%Vor%

Ihr zweiter Fall sieht schwieriger aus (und wie ein besserer Test der Korrektheit) als der erste, also richte ich eine Metamatrix ein, um das zu erreichen.

%Vor%

Aus praktischen Gründen habe ich eine Place-Funktion erstellt, die eine Matrix an der angegebenen Stelle in eine andere Matrix einfügt.

%Vor%

Die magischen Zahlen, die in GetLength() eingegeben wurden, haben nur nach Fehlern gefragt, also habe ich einige Konstanten für sie definiert ( ROW_DIM = 0 und COL_DIM = 1 ). Ich entschied mich für das Padding, indem ich herausfinde, wie breit eine Spalte ist und wie groß eine Zeile ist und zusätzliche Elemente überspringe, nachdem% die Submatrix in% aufgelöst hat. Eine Place() und GetRowHeight() Methode finde die Werte heraus.

%Vor%

Eine GetColWidth() -Funktion durchläuft alle Untermatrizen, Flatten() in der entsprechenden Zeile und Spalte in einer neuen Matrix. Es aktualisiert die nächste Zeile und Spalte nach jedem Place() mit den Funktionen Place() und GetRowHeight() .

%Vor%

Ein bisschen Kleber, um es zu testen ...

%Vor%

... und Sie erhalten eine Ausgabe genau wie in Ihrem zweiten Fall mit all den seltsam passenden Matrizen und GetColWidth() s an den leeren Stellen. *

%Vor%

* Die Zielmatrix erhält ihre Werte initialisiert auf 0 , was zufälligerweise default(double) (der gewünschte Wert) ist. Wenn Sie etwas anderes als 0 für die leeren Stellen benötigen, können Sie sie wahrscheinlich erhalten, indem Sie über die neue Matrix iterieren und den neuen Standardwert überall vor dem default(double) in die Metamatrix schreiben.

(Danke an Jeff Mercado für den Hinweis, dass die Methode Flatten() der multidimensionalen Arrays verwendet werden kann, um ihre Dimensionen zu finden.)

    
Mirinth 12.07.2014, 03:20
quelle
1

Ich denke, es wäre vorteilhaft für Sie, die Lösung in die Quadranten aufzuteilen, die Sie füllen möchten. Dies alles wird unter der Annahme sein, dass wir nur 4 Matrizen in dieser 2x2 Konfiguration kombinieren werden. Dieselben Strategien, die hier erläutert werden, können auf andere Dimensionen von Matrizen angewendet werden, die kombiniert werden sollen.

Also geben wir 4 Matrizen A, B, C und D, wir werden versuchen, eine resultierende Matrix in dieser Anordnung zu bauen:

%Vor%

Bevor wir anfangen können, müssen wir die Dimensionen des Endergebnisses herausfinden. Dies sollte hoffentlich Sinn machen. Wir haben eine obere Hälfte, untere Hälfte, linke Hälfte und rechte Hälfte.

%Vor%

Dann wollen wir überlegen, welche Bereiche der Ergebnismatrix wir für jede der 4 Matrizen kopieren wollen. Wenn man den Ursprung oben links betrachtet, wird alles auf der rechten Hälfte um die Größe der linken Hälfte verschoben, alles auf der unteren Hälfte wird um die Größe der oberen Hälfte verschoben. Die Offsets für jede der Matrizen wären:

%Vor%

Nun können wir mit all diesen Informationen beginnen, die Ergebnismatrix aufzubauen. Kopieren Sie einfach die Werte aus jeder Matrix in das Ergebnis, wobei die Offsets angewendet werden.

Also im Code würde ich das tun:

%Vor%

Dann demonstrieren Sie das Ergebnis in Bezug auf Fall 2:

%Vor%

Dies kann natürlich auf Matrizen beliebiger Größe verallgemeinert werden. Das Konzept ist in jedem Schritt des Prozesses gleich.

Gegebene m x n Matrizen werden wir versuchen, eine resultierende Matrix in dieser Anordnung zu bauen:

%Vor%
  1. Ermittelt die Dimensionen der einzelnen Slices.

    %Vor%
  2. Erhalten Sie die Offsets für jede der Matrizen. Jede vertikale Schicht ist um die gesamte Anzahl von Spalten in den vorherigen vertikalen Schichten nach links versetzt. Jedes horizontale Segment ist um die gesamte Anzahl der Zeilen in den vorherigen horizontalen Segmenten nach unten versetzt.

    %Vor%

Nun können wir die Ergebnismatrix aufbauen.

%Vor%     
Jeff Mercado 12.07.2014 03:58
quelle
-1

Ich denke, Sie müssen den Array-Elementen rowid und columnid entsprechen, um das Indizierungsproblem der äußeren Matrix zu erreichen. Angenommen, Sie haben bereits eine Matrix-zu-Matrix-Objektkonvertierung;

Ich bin mir nicht sicher, ob ich die Regeln richtig verstanden habe, aber hier ist was ich bisher umgesetzt habe:

Ich habe Matrix- und MatrixList-Klassen wie folgt implementiert:

%Vor%

Mit diesen Klassen habe ich den folgenden Algorithmus implementiert:

%Vor%

wobei init eine Methode zum Füllen der Objekte ist, die wie folgt implementiert wird:

%Vor%

Ich war auf einer Windows Forms-Dummy-App, also habe ich eine richtextbox benutzt, um den obigen Code zu testen.

%Vor%

und das Ergebnis ist:

%Vor%

Ich habe nicht viel Zeit, um Array-Objekte mit hübschen Zahlen zu versehen, um sie im Moment sehr übersichtlich zu zeigen, aber ich denke, Sie können die Idee verstehen.

    
Oğuz Sezer 11.07.2014 08:09
quelle