Matrix(Array) minimieren...

l4mer

Mitglied
Hi mates,

Ich benötige eine Methode, welche mir eine gegebene Matrix mittels dem "Matrix-Minimum-Verfahren" minimiert und ein Basislösung ausgibt. Einlesen der Daten sowie erstellen des Arrays aka der Matrix ist kein Problem. Habe bis jetzt eine Methode(Schleife) welche jeweils das Minimum in der Matrix sucht und mittels einfacher if-else Anweisung entweder eine Spalte oder eine Zeile löscht und anschließend den Inhalt in ein neues Array schreibt was entsprechend kleiner ist...funktioniert soweit auch alles und jetzt kommt meine Frage, welche bestimmt total doof klingt.
Wie übergebe ich jetzt der Schleife das kleinere Array um dieses nun wieder zu verkleinern? Da ich mich erst seit einem Jahr intensiv mit dem Programmieren beschäftige und ich denke das diese Frage eher eine Allgemeine Frage bzw. Verständnisfrage ist...bin ich über jeden Tipp dankbar.
Cheers
 

JStein52

Top Contributor
Meinst du so was:

Java:
        int[][] array = null;
        int[][] daten = {{1,2,3},{3,4,5},{6,6,6}};
        int[][] neueDaten = {{1,3,5}, {2,4,6},{7,8,9}};
      
        array = daten;
        for (int i=0; i<3;i++) {
            for(int j=0;j<3; j++) {
                System.out.print(array[i][j]);
            }
            System.out.println();
        }
        array = neueDaten;
        for (int i=0; i<3;i++) {
            for(int j=0;j<3; j++) {
                System.out.print(array[i][j]);
            }
            System.out.println();
        }

Du hast eine Referenz auf ein zweidimensionales Array namens array. Wohin diese nun zeigt kannst du ja beliebig festlegen.
 

l4mer

Mitglied
Erstmal danke...naja nich ganz das Problem ist das es eine Matrix wo nicht sagen die ist immer 4x4 die kann auch 5x5 sein...dein Vorschlag ist nicht falsch aber nicht was ich suche...ich will eine Algorithmus schreiben und kann jetzt nicht 4 arrays deklarieren und und jedes mal mit for-Schleifen und if-else fragen was passiert...entweder ich stehe gerade sowas von auf dem Schlauch oder es gibt eine andere Möglichkeit xD...versteht man überhaupt das Problem

Edit Ich glaube ich brauche erstmal Abstand und nen klaren Kopf, for fuck sake
 

JStein52

Top Contributor
Die Matrix muss doch nicht immer 4x4 sein. Das war nur Zufall dass bei mir die zweite genauso gross war wie die erste. Du wolltest doch wissen wie du deiner Schleife ein anderes (grösser, kleiner, egal) Array mitgibst. Und was ich dir sagen wollte ist: du arbeitest in der Schleife immer mit einer bestimmten Referenz auf die aktuell Matrix. Und für die nexte Schleife setzt du einfach die Referenz auf die verkleinerte Matrix.
 

l4mer

Mitglied
Ja, dass habe ich kapiert danke...sagen wir ich will die Matrix zum Schluss auf einen Eintrag reduzieren...muss ich jetzt wirklich 5 oder mehr Referenzen setzen 10 for-Schleifen usw. schreiben

Ich stelle mir das irgendwie "effizienter" vor xD
 

JStein52

Top Contributor
Du hast doch gesagt am Ende eines Schleifendurchlaufs hast du aus einer grossen Matrix eine kleinere gemacht. Und die willst du jetzt wieder verkleinern oder ? dann setzt du einfach die Referenz die vorher auf die grosse Matrisx zeigt am Ende deiner Schleife auf die verkleinerte Matrix und machst das selbe wieder.
Hast du denn schon ein Stück Code zum anschauen ?
 

l4mer

Mitglied
Java:
package basislösung;

public class MatrixMin {

  
    public void minimieren(int[][] transportmatrix){
          
      
        int[][] neue=null;
      
        int min=Integer.MAX_VALUE;
      
        int sum_kapazität = 0;  
        int sum_bedarf = 0;
      
        int[] spalte = new int[5];
        int s_index= 0;
        int[] zeile = new int[5];
        int z_index= 0;
      
        int l = 0;
        int x = 0;
        int y = 0;
      
        int[][] werte = new int[9][2];                                                //m+n-1 Basislösungen...9
              
        for(int i=1;i<transportmatrix.length-1;i++){
            for(int j=6;j<transportmatrix[i].length;j++){
                int u = transportmatrix[i][j];
                spalte[s_index]=u;
                s_index++;
            }          
        }
      
        for( int i : spalte) {                                          
            sum_kapazität += i;                  
        }
      
      
        for(int i=6;i<transportmatrix.length;i++){
            for(int j=1;j<transportmatrix[i].length-1;j++){
                int u = transportmatrix[i][j];
                zeile[z_index]=u;
                z_index++;
            }
        }
                                                                                          
        for( int i : zeile) {
            sum_bedarf += i;
        }
      
        //System.out.println(sum_kapazität+" "+sum_bedarf);
      
        //while(sum_kapazität != 0 && sum_bedarf != 0){
        //    System.out.println("lol");
        //}
        //
        //
        //
        //hier ist mein problem ich verkleinere die transportmatrix nachfolgend und schreibe alles in ein kleiners array=mini
        //entweder mit einer spalte weniger oder eben mit einer zeile weniger...
        //
        //jetzt muss ich diese matrix mini eben wieder um eine zeile oder spalte verringern werden bis 9(m+n-1) variablen gefunden wurden
        //ich weiß nicht wie ich mein problem weiter erklärn soll...
        //
        //
              
for(int ro=0;ro<3;ro++){                                                        //Schleife bis Matrix minimiert ist, Abbruch ist m+n-1=9
          
        System.out.println("Angebot"+sum_kapazität+"Nachfrage"+sum_bedarf);
  
        for (int r = 1; r < transportmatrix.length-1; r++){                                                                       
              for (int c = 1; c < transportmatrix[r].length-1; c++){
                  if(transportmatrix[r][c] < min){
                    min = transportmatrix[r][c];
                  }
              }
        }          
        System.out.println("Kleinste Element in der Matrix: "+"("+min+")");
      
        for(int i=1;i<transportmatrix.length-1;i++){
            for(int j=1;j<transportmatrix[i].length-1;j++){
                    l = transportmatrix[i][j];                  
                if(l==min){  
                    x=j;
                    y=i;
                    System.out.println(i+" "+j+" Position im Array: "+"("+l+")");
                }                          
            }                  
        }
      
        int bedarf = transportmatrix[6][x];                                            //letztes Element der Spalte...
        int kapazität = transportmatrix[y][6];                                         //letztes Element der Zeile...
      
        for(int w=1;w<transportmatrix.length;w++){
            for(int v=1;v<transportmatrix[w].length;v++){
                int u = transportmatrix[w][v];
                System.out.print(u+"\t");
            }
            System.out.println();
        }
      
      
      
        if(bedarf>kapazität){//Zeile löschen                                                    //Check ob Zeile oder Spalte gelöscht wird...
          
          
          
            int[][] mini = new int[transportmatrix.length-1][transportmatrix[0].length];        //Neue, verkleinerte Matrix mit einer Zeile weniger...
          
            System.out.println();
          
            int mini_row = 0;
            int mini_column = 0;
          
            transportmatrix[y][6]=0;                                              
            transportmatrix[6][x]=bedarf-kapazität;
              
            werte[ro][0] = kapazität;                                                //Kosten und Variable werden in Zwischenmatrix geschrieben...
            werte[ro][1] = min;
          
                for(int r = 1; r < y; r++){                                            //Schleife zum holen der Elemente und verschieben in neue Matrix mit gelöschter Zeile bzw. Spalte
                    for(int c = 1; c < transportmatrix[r].length; c++){
                        int u=transportmatrix[r][c];
                        mini[mini_row][mini_column]=u;
                        mini_column++;
                        //System.out.print(u+"\t");
                    }
                    mini_column=0;
                    mini_row++;
                    //System.out.println();
                }              
                for(int r = y+1; r < transportmatrix.length; r++){                                          
                    for(int c = 1; c < transportmatrix[r].length; c++){
                        int u=transportmatrix[r][c];
                        mini[mini_row][mini_column]=u;
                        mini_column++;
                        //System.out.print(u+"\t");
                    }
                    mini_column=0;
                    mini_row++;
                    //System.out.println();
                }              
              
                for(int z=0;z<mini.length-1;z++){
                    for(int o=0;o<mini[z].length-1;o++){
                        int u = mini[z][o];
                        System.out.print(u+"\t");
                    }
                    System.out.println();
                }
              
                neue=mini;
                      
        }else{//Spalte löschen
          
            int[][] mini = new int[transportmatrix.length][transportmatrix[0].length-1];        //Neue, verkleinerte Matrix mit einer Spalte weniger...
          
            System.out.println();
          
            int mini_row = 0;
            int mini_column = 0;
          
          
            transportmatrix[y][6]=kapazität-bedarf;                                              
            transportmatrix[6][x]=0;
          
            werte[ro][0] = bedarf;                                                    //Kosten und Variable werden in Zwischenmatrix geschrieben...
            werte[ro][1] = min;
          
              
                for(int r = 1; r < transportmatrix.length; r++){                    //Schleife zum holen der Elemente und verschieben in neue Matrix mit gelöschter Zeile bzw. Spalte
                    for(int c = 1; c < x; c++){
                        int u=transportmatrix[r][c];
                        mini[mini_column][mini_row]=u;
                        mini_row++;
                        //System.out.print(u+"\t");
                    }
                    mini_row=0;
                    mini_column++;
                    //System.out.println();
                }  
                              
                mini_row=x-1;                                                        //sonst Out-of-Bound Exception....
                mini_column=0;
              
                for(int r = 1; r < transportmatrix.length; r++){                  
                    for(int c = x+1; c < transportmatrix[r].length; c++){
                        int u=transportmatrix[r][c];
                        mini[mini_column][mini_row]=u;
                        mini_row++;
                        //System.out.print(u+"\t");
                    }
                    mini_row=x-1;
                    mini_column++;
                    //System.out.println();
                }  
              
              
                for(int z=0;z<mini.length-1;z++){
                    for(int o=0;o<mini[z].length-1;o++){
                        int u = mini[z][o];
                        System.out.print(u+"\t");
                    }
                    System.out.println();
                }
              
                neue=mini;          
        }
        System.out.println();
      
    }
      
          
  
    for(int z=0;z<werte.length;z++){
        for(int o=0;o<werte[z].length;o++){
            int u = werte[z][o];
            System.out.print(u+" ");
        }
        System.out.println();
    }
  
              
    }
}
 

klauskarambulut

Bekanntes Mitglied
und danke klauskaramulut aber die Funktionsweise is mir klar

Sehr schön, dass dir das klar ist. "Und die willst du jetzt wieder verkleinern oder ?" könnte vielleicht bedeuten das ihm das nicht klar ist und es deine Aufgabe ist dafür zu sorgen, dass ihm das klar wird.

Gefällt dir den der Code?

Das ist totaler Schrott, den sich niemand durchliest.

Ein rekursiver Ansatz:

Java:
public void minimize(int[][] cost){
  if(isEmpty(cost)) {
    System.out.println("Done! - Cost Matrix is empty");
    return;
  }
  int row = findMinCostRowIndex(cost);
  int col = findMinCostColumnIndex(cost, row);
  
  int costPerPiece = getCostPerPiece(cost, row, col);
  int amount = moveAmount(cost, row, col);

  System.out.printf("Move %d pieces with cost: %d from %d to %d%n", amount, costPerPiece, row, col);

  int availableSupply = findSupplyFor(cost, row);
  int availableDemand = findDemandFor(cost, col);

  int[][] reducedCost = cost;
  if(amount == availableSupply) {
    reducedCost = removeRow(reducedCost, row);
  }
  if(amount == availableDemand) {
    reducedCost = removeColumn(reducedCost, col);
  }
  
  //Recursiver Aufruf
  minimize(reducedCost);
}

Warum ist das jetzt besser? Es sind keine Schleifen mehr vorhanden. Auch keine geschachtelten Schleifen.
Der Code spricht. Eine Methode passt zumindest noch auf eine Bildschirmseite.
Die einzelnen Methoden sind einfacher, klar definiert und können besser getestet, weil einzeln angesprochen werden.

Beispiel einer dieser einfachen Methoden
Java:
 int findMinCostColumnIndex(cost, row) {
  int minIndex = 0;
  for(int i = 1; i < cost[row].length; i++) {
    if(cost[row][i] < cost[row][minIndex]) {
      minIndex = i;
    }
  }
  return minIndex;
}

Java:
int findMinCostRowIndex(cost) {
  int minRowIdx = 0;
  int minColIdx = findMinCostColumnIndex(cost, 0);
  for(int i = 1; i < cost.length; i++) {
    int currentMinColIdx = findMinCostColumnIndex(cost, i);
    if(cost[i][currentMinColIdx] < cost[minRowIdx][minColIdx]) {
      minRowIdx = i;
      minColIdx = currentMinColIdx;  
    }
  }
  return minRowIdx;
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Zweidimensionaler Array; n x m - Matrix überprüfuen Java Basics - Anfänger-Themen 35
C Matrix mit Array ausgeben Java Basics - Anfänger-Themen 6
U Dreiecks-Matrix mit Array Java Basics - Anfänger-Themen 3
Z Matrix Klasse mit Mehrdimensionalen Array (Addition, Multiplikation, to String) Java Basics - Anfänger-Themen 57
E 2D Array - char durch die Matrix "wandern" lassen Java Basics - Anfänger-Themen 7
H 2D Array, Symmetrische Matrix Java Basics - Anfänger-Themen 12
V Methoden Matrix als 1D Array mit Werten füllen Java Basics - Anfänger-Themen 12
A daten vom 1d array in 2d matrix speichern Java Basics - Anfänger-Themen 3
E Array als Matrix Java Basics - Anfänger-Themen 21
Z mehrdimensionales Array, Matrix "invertieren" Java Basics - Anfänger-Themen 4
G Array ,Matrix Problem Java Basics - Anfänger-Themen 20
I matrix aufgabe Java Basics - Anfänger-Themen 22
idontknow707 Matrix nach z.B. Variable durchsuchen Java Basics - Anfänger-Themen 4
F Adjunkte Matrix erstellen Java Basics - Anfänger-Themen 3
M Matrix Java Basics - Anfänger-Themen 3
F Matrix Multiplikation Java Basics - Anfänger-Themen 3
B Dünn besetzte Matrix Java Basics - Anfänger-Themen 7
Al3xand3r01 Matrix, Nachbarelemente Java Basics - Anfänger-Themen 16
E Rückwärtsmultiplikation einer invertierten matrix Java Basics - Anfänger-Themen 2
M Matrix auf 4 Elemente untersuchen mit offenen Enden Java Basics - Anfänger-Themen 8
B Diskrete Faltung (Matrix) Randfälle Java Basics - Anfänger-Themen 8
M Matrix Elemente vergleichen Java Basics - Anfänger-Themen 11
N Quadratische Matrix inkl Summe Java Basics - Anfänger-Themen 8
J Methoden Moving a n integer matrix Java Basics - Anfänger-Themen 3
D Methoden Matrix Multiplikation Java Basics - Anfänger-Themen 27
O Matrix, Vektor Java Basics - Anfänger-Themen 9
S Matrix spaltenweise befüllen Java Basics - Anfänger-Themen 1
T Zufällige Matrix in neue Matrix schreiben Java Basics - Anfänger-Themen 6
C Matrix-Werte werden nicht wie erwartet ausgegeben Java Basics - Anfänger-Themen 7
C Matrix erstellen Spaltensumme, Zeilensumme, Diagonale Java Basics - Anfänger-Themen 1
S Methoden Transponierte Matrix Java Basics - Anfänger-Themen 3
N Vererbung Submatrix mit Verweis auf Matrix erstellen Java Basics - Anfänger-Themen 9
J Matrix erstellen Java Java Basics - Anfänger-Themen 7
B Transponiertes Matrix Java Basics - Anfänger-Themen 12
J Überprüfen, ob eine 2D Matrix ein Baum ist Java Basics - Anfänger-Themen 5
C Matrix transponieren - Hilfe Java Basics - Anfänger-Themen 1
D Ausgabe einer Matrix mit System.out.println Java Basics - Anfänger-Themen 6
T Art 4 Felder Matrix Memory Java Basics - Anfänger-Themen 2
U Ist diese Methode zur Matrix Vektor Multiplikation korrekt ? Java Basics - Anfänger-Themen 5
E Matrix mit Vektor multiplizieren Java Basics - Anfänger-Themen 7
S eingegebene Matrix anzeigen Java Basics - Anfänger-Themen 4
J Matrix für Schachbrett Java Basics - Anfänger-Themen 6
G tga Datei lesen und in eine matrix umwandeln Java Basics - Anfänger-Themen 1
G Bilddaten in Matrix umwandeln Java Basics - Anfänger-Themen 1
T Eine String Matrix erstellen die eine boolean Funtion verwendet Java Basics - Anfänger-Themen 10
O Matrix Multiplizieren Java Basics - Anfänger-Themen 4
S LWJGL - Matrix vom Matrixstack laden Java Basics - Anfänger-Themen 3
T Matrix auf Symmetrie überprüfen Java Basics - Anfänger-Themen 6
V Matrix Transponieren Java Basics - Anfänger-Themen 3
W Zweidimensionale Arrays als Matrix ausgeben Java Basics - Anfänger-Themen 8
R Matrix-Vektor-Multiplikation Java Basics - Anfänger-Themen 13
O Matrix ordnen Java Basics - Anfänger-Themen 4
M Symmetrische Matrix Java Basics - Anfänger-Themen 2
W Methoden Rang von einer Matrix mit Gauss Java Basics - Anfänger-Themen 0
U Matrix Subtrahieren Java Basics - Anfänger-Themen 12
E Input/Output convert string to two dimensional char and output = matrix Java Basics - Anfänger-Themen 2
I Matrix überprüfen Java Basics - Anfänger-Themen 8
Z Matrix mit Vektor multiplizieren Java Basics - Anfänger-Themen 13
K Methoden Einlesen einer unbegrenzten Matrix über Konsole Java Basics - Anfänger-Themen 6
O Einlesen einer Matrix von der Console Java Basics - Anfänger-Themen 18
N Matrix/Vektoren Java Basics - Anfänger-Themen 3
N Matrix Java Basics - Anfänger-Themen 14
T Methode, die eine 2 dimensionale Matrix kopiert. Java Basics - Anfänger-Themen 16
J Matrix Java Java Basics - Anfänger-Themen 3
D 2 mehrdimensionale Matrix einlesen Java Basics - Anfänger-Themen 2
A N*N Matrix Determinante berechnen Java Basics - Anfänger-Themen 47
K Quadratische Matrix um 90° drehen Java Basics - Anfänger-Themen 5
C Programm zur Berechnung der Spur einer Matrix Java Basics - Anfänger-Themen 4
B Zeilenumbruch (zweidim. Matrix) Java Basics - Anfänger-Themen 2
O Java Matrix mal Matrix über while Schleife... Java Basics - Anfänger-Themen 10
O Transponieren einer Matrix per While-Schleife Java Basics - Anfänger-Themen 3
M Matrix - Probelm Java Basics - Anfänger-Themen 7
O 2D Matrix befüllen mit geraden Zahlen!? Java Basics - Anfänger-Themen 14
J Java Matrix befüllen Java Basics - Anfänger-Themen 5
M Matrix Matrix Multiplikation Java Basics - Anfänger-Themen 6
F Matrix Java Basics - Anfänger-Themen 11
G OOP Parameter Matrix Java Basics - Anfänger-Themen 2
N Matrix Klasse Java Basics - Anfänger-Themen 4
B Maske an eine Matrix anpassen Java Basics - Anfänger-Themen 5
W Matrix übergeben Java Basics - Anfänger-Themen 7
T Matrix transponieren Java Basics - Anfänger-Themen 17
W Eine Methode schreiben, ob eine Matrix eine Diagonalmatrix ist.? Java Basics - Anfänger-Themen 3
M String Datei in Float-Matrix umwandeln Java Basics - Anfänger-Themen 8
D Problem: Werte eine Matrix vergleichen! Java Basics - Anfänger-Themen 5
B Matrix Java Basics - Anfänger-Themen 2
Semox Matrix multiplizieren Java Basics - Anfänger-Themen 4
N Matrix an toString Java Basics - Anfänger-Themen 7
C Diagonale in einem NxN Matrix Java Basics - Anfänger-Themen 6
F Einträgen von Matrix zu sotieren Java Basics - Anfänger-Themen 2
D JUnit auf Matrix anwenden Java Basics - Anfänger-Themen 5
J Spezielle Matrix ausgeben ! Java Basics - Anfänger-Themen 8
S Problem bei Matrix Addition Java Basics - Anfänger-Themen 5
F matrix werte übergeben Java Basics - Anfänger-Themen 5
M Hauptdiagonale Matrix berechnen Java Basics - Anfänger-Themen 6
M Klassenerstellung für Matrix mit Rechenopperationen Java Basics - Anfänger-Themen 42
D Matrix .bat datei erstellen und öffnen Java Basics - Anfänger-Themen 2
J Matrix ausgeben Java Basics - Anfänger-Themen 9
N Matrix Matrix Produkt Java Basics - Anfänger-Themen 7
N prüfe ob etwas in einer Matrix steht... Java Basics - Anfänger-Themen 14
L rechtecke zeichnen anhand von matrix Java Basics - Anfänger-Themen 27

Ähnliche Java Themen

Neue Themen


Oben