Sattelpunkt einer Matrix

Status
Nicht offen für weitere Antworten.
G

Gagamel

Gast
Bin mal wieder hier :)
Also das Problem ist ansich relativ einfach, man sollte eine Matrix einlesen, bestimmen ob symmetrisch oder nicht, die Transponierte bestimmen und den Sattelpunkt, falls vorhanden

Bis auf den Sattelpunkt habe ich das auch hinbekommen, aber da scheiter ich.

Ok ich weiß, dass der Sattelpunkt, einen niedrigsten Wert in der Zeile und einen höchsten in der Spalte hat.
Um das zu lösen brauche ich auf jeden Fall ein Zwischenarray. Dennoch komme ich irgendwie auf keinen vernünftigen Algorithmus
bzw
erst die niedrigsten Werte der Zeilen in ein Array --> das habe ich geschafft

Code:
public static double sattelpunkt(double[][] matrixSat, int x, int y){
     int x1=0,y1=0;
     double[][] matrixZeile = new double[1][x];   //niedrigster Wert der Zeile
     

     for (y1=0; y1<=(y-1); y1++){
     matrixZeile[0][y1]=matrixSat[0][y1]+1;
     for (x1=0;x1<=(x-1);x1++){
     // System.out.println(matrixZeile[0][y1] +"   "+matrixSat[x1][y1]);

       if (matrixSat[x1][y1] < matrixZeile[0][y1]){
         matrixZeile[0][y1]=matrixSat[x1][y1];
          }
     }

Dann müßte ich bestimmen ob einer dieser Punkte der höchste in seiner Spalte ist und hier scheiter ich, der Code den ich bisher gebaut habe hat wenn überhaupt nur für einen spezifischen Fall funktioniert oder aber außer Acht gelassen, dass es auch sein kann, dass kein Sattelpunkt existiert.
Könnte mir da jemand auf die Sprnge helfen

zum Verständnis das restliche Programm.

Code:
import java.util.*;
import java.io.*;

public class Aufgab2_beta
{
  static boolean neustart=false;
  public static void main( String args[] )
  {
  int x=0,y=0;
  Scanner sc = new Scanner(System.in);
  boolean symmetrisch;
  do{
  System.out.println("Bitte geben sie die Matrixdimension mit Leerzeichen getrennt ein (Spalten Zeilen)");
  try {
       neustart=false;                      //boolean für Neustart bei Falscheingabe
       x=sc.nextInt();                      //Spaltenanzahl
       y=sc.nextInt();                      //Zeilenanzahl
       }
     catch (Exception e){
       System.out.println("Ungueltige Angabe");
       sc.next();
       neustart=true;
     }
   }
   while (neustart==true);
   
   
   double[][] matrix = new double[x][y];     //Array mit x Spalten und y Zeilen
   double[][] matrixTrans = new double[y][x];
   double sattel;
   
                                             
   matrix=einlesen(x,y);                     //Eingaberoutine der Matrix. Übergeben werden x und y für die
                                             //Matrixausmeßungen
   
   matrixAusgabe(matrix,x,y);                //Ausgabe der eingegebenen Matrix mit y Zeilen und x Spalten
   symmetrisch = symmetrieCheck(matrix,x,y);
   matrixTrans = transpo(matrix,x,y);
   System.out.println("\n \n \n");
   matrixAusgabe(matrixTrans,y,x);
   //sattel = sattelpunkt(matrix,x,y);
  //System.out.println("\n \n \n");
   //System.out.println(sattel);
   
}



  public static double[][] einlesen(int x, int y){
    double[][] matrix = new double[x][y];            //Erzeugung von Array mit x Spalten und y Zeilen
    boolean neustart=false;
    Scanner sc = new Scanner(System.in);
    do{
    neustart=false;
    for (int y1=0;y1<=(y-1);y1++){                   //gehe Zeilen durch
      System.out.println("Geben sie die Werte der Zeile "+(y1+1)+" mit Leerzeichen getrennt ein.(a b c)");
      for(int x1=0;x1<=(x-1);x1++){                  //gehe Spalten durch
        try {
          matrix[x1][y1]=sc.nextDouble();              //trage Werte ein
          }
        catch(Exception E){
          System.out.println("Ungueltige Eingabe");
          neustart=true;
          sc.next();
          y1=y+1;
          break;
        }
      }
    }
    }
    while(neustart==true);
    return matrix;
  }



  public static void matrixAusgabe(double[][] matrixAusgabe,int x, int y){
    int x1,y1;
    for (y1=0; y1<=(y-1); y1++){  //i für die Zeilen, j für die Spalten
    System.out.println();
      for (x1=0; x1<=(x-1); x1++){
      System.out.print(matrixAusgabe[x1][y1] + "   ");
      }
    }
  }
  
  
  public static boolean symmetrieCheck(double[][] matrixSym, int x, int y){
    int x1=0,y1=0;
    if (x==y){
      for (y1=0; y1<=(y-1); y1++){
        for (x1=0;x1<=(x-1);x1++){
          if (matrixSym[x1][y1]!=matrixSym[y1][x1]) {
            return false;                                            }
        }
      }
    return true;
    }
    return false;
  }


  public static double[][] transpo(double[][] matrixTrans,int x, int y){
  int x1=0,y1=0;
  double[][] matrixTransNew = new double[y][x];
    for (y1=0; y1<=(y-1); y1++){
      for (x1=0;x1<=(x-1);x1++){
      matrixTransNew[y1][x1]=matrixTrans[x1][y1];
      }
    }
   return matrixTransNew;
  }
 public static double sattelpunkt(double[][] matrixSat, int x, int y){
[/code]
 

Redfrettchen

Bekanntes Mitglied
Hi,
erstmal ein paar Bemerkungen:

1. Die Methodik beim Einlesen sieht sehr komisch aus.
Besser:
Code:
...
// Ich geh mal davon aus, dass Scanner existiert...
Scanner sc = new Scanner(System.in);
String s;
while (true) {
    System.out.println("...");
    try {
        // und next() eine Zeile einliest.
        s = sc.next();
    } catch (Exception e) {
        System.out.println("Ungueltige Eingabe");
        continue;
    }
break;
}

2. Was sind das für Zählschleifen?
Besser:
Code:
for (int x1=0; x1<x; x1++)
// Man beachte, dass die Zählvariable innerhalb der Schleife deklariert wurde.
// Nach der Schleife wird sie so wieder gelöscht.
...

3. Wenn du ein Array übergibst, dann kann die Methode selbst die Abmessungen herausfinden:
Code:
...
int[][] matrix = einlesen(x,y);
ausgeben(matrix);
...
void ausgeben(int[][] matrix) {
   int y=matrix.length, x=matrix[0].length;
   // denn das Array sollte ja rechteckig sein.
   ...
}

4. Allgemein besser wäre es natürlich, wenn Matrizen eine eigene Klasse bekämen und sich selbst verwalten. So wie du es gemacht hast sieht es sehr prozedural aus.

Nun zum eigentlichen Problem.
In deiner Sattelpunkt-Methode erstellst du ein zweidimensionels Array, das aber nur aus einer Zeile besteht. Wieso? Es reicht doch ein einfaches Array für das speichern einer Zeile von Daten. Außerdem steht da zwar als Kommentar, dass der niedrigste Wert der Zeile gespeichert wird, das Array wird aber so angelegt, dass für die Anzahl der Spalten Platz gemacht wird (x ist die Anzahl der Spalten oder die Länge einer Zeile, oder?).
Du durchläufst die Zeilen, speicherst in deinen Hilfsarray den Wert der ersten Spalte in der Zeile, allerdings um 1 erhöht. Dann durchläufst du die aktuelle Zeile, wobei die Werte mit der gespeicherten verglichen, und falls sie kleiner sind, in das Speicherarray übertragen werden.
Du könntest gleich den ersten Wert als Referenzwert behalten und alle weiteren in der Zeile mit ihm vergleichen und ggf. ersetzen. Aber ich glaube, es wäre besser, statt dem Wert die jeweilige Spalte zu merken
Daraus folgt:
Code:
  public static double sattelpunkt(double[][] matrixSat){ 
      int y=matrixSat.length, x=matrixSat[0].length;
  	double ref; // Referenzwert
  	int[] matrixZeile = new int[x];   // Spalte des niedrigsten Wertes in der Zeile

  	for (int y1=0; y1<y; y1++) { 
  	    ref = matrixSat[y1][0];
  	    matrixZeile[y1] = 0;

  	    for (int x1=1;x1<x;x1++) { 
  	        if (matrixSat[y1][x1] < ref){
  	            ref = matrixSat[y1][x1];
  	            matrixZeile[y1]=x1; 
  	        } 
  	    }
  	}
Ja und dann kannst du die ganze Suche doch nocheinmal durchlaufen lassen nur suchst du diesmal nach dem größten Wert in den Spalten. Schließlich durchläufst du nocheinmal das erste Hilfsarray und überprüfst, ob das zweite Hilfsarray an der Stelle des aktuellen Element (es ist eine Spaltenposition) die Laufvariable ist. Wenn ja, dann ist ein Sattelpunkt gefunden.
Code:
  public static double sattelpunkt(double[][] matrixSat){ 

      int y=matrixSat.length, x=matrixSat[0].length;
  	double ref; // Referenzwert
  	int[] matrixZeile = new int[x];   // Spalte des niedrigsten Wertes in der Zeile

  	for (int y1=0; y1<y; y1++) {
	    // erste Spalte der Zeile als Referenzwert
  	    ref = matrixSat[y1][0];
  	    matrixZeile[y1] = 0;

  	    for (int x1=1; x1<x; x1++) {
  	        if (matrixSat[y1][x1] < ref){
		    // neue Referenz setzen und Spalte speichern
  	            ref = matrixSat[y1][x1];
  	            matrixZeile[y1]=x1; 
  	        } 
  	    }
  	}

  	int[] matrixSpalte = new int[y]; // Zeile des höchsten Wertes der Spalte
  	for (int x1=0; x1<x; x1++) {
	    // erste Zeile der Spalte als Referenzwert
  	    ref = matrixSat[0][x1];
  	    matrixSpalte[x1]=0;

  	    for (int y1=1;y1<y;y1++) {
  	        if (matrixSat[y1][x1] > ref) {
  	            ref = matrixSat[y1][x1];
  	            matrixSpalte[x1]=y1;
  	        }
  	    }
  	}

  	for (int y1=0; y1<x; ++y1) {
  	    if (matrixZeile[matrixSpalte[y1]] == y1) return matrixSat[matrixSpalte[y1]][y1];
  	}
    return 0;
  }

Aber ein anderes Problem wäre vielleicht noch, dass der Benutzer es irgendwie erfahren sollte, wenn es keinen Sattelpunkt gibt. Bei mir steht da jetzt einfach "return 0", aber das ist ja nicht die Lösung. Da musst du dir noch irgendwas mit Rückgabewert boolean überlegen. Wie gesagt, eine Matrizen-Klasse wäre besser.

Grüße und viel Spaß,
Redfrettchen
 
G

Gagamel

Gast
Erstmal ein riesiges Danke :)

zu 1.) Hier verstehe ich deine Version nicht sc.next() liest meines Wissens einen String ein, den müßte ich aber dann ja erst noch wieder auseinander schneiden und umwandeln um ihn in die Matrix einzutragen.

Aber eine while(true)-SchleifenVariante wäre in der Tat irgendwie besser als immer eine Hilfsvariable zu benutzen, das baue ich nochmal um


zu 2.)habe ich erst später bedacht, dass man die Zählvariablen ja auch in der Schleife definieren könnte, habe das waber zumindest mal vereintheitlicht und mal genauere Variablennamen benutzt

zu 4.)das weiß ich gar nicht, wie man das macht. Wir haben erst die 2.Woche Java und ich fand es schon recht schwer mir, dies alles beizubringen. Wie man das Programm auf mehrer Klassen aufteilt müßte ich mich auch erstmal reinlesen, darum ist halt noch alles in einer Datei.


Die Lösung schaue ich mir jetzt erst einmal genauer an, man sollte ja auch durch das durchsteigen, was man benutzt :=)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Methoden Ausgabe aller Attribute einer Instanz ohne einzelne Methode Java Basics - Anfänger-Themen 3
krgewb remove beim Iterieren einer HashMap Java Basics - Anfänger-Themen 3
D wie kann ich gcc aus einer .java datei heraus aufrufen? Java Basics - Anfänger-Themen 2
F http post einer Webseite nachahmen Java Basics - Anfänger-Themen 3
C Abbruch einer Schleife mit break, meine Übung funktioniert nicht richtig Java Basics - Anfänger-Themen 4
G JTable bei aktivieren einer Zelle soll Text selektiert werden. Java Basics - Anfänger-Themen 24
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
ixChronos Letzten 4 Ziffern einer großen Zahl ausgeben Java Basics - Anfänger-Themen 3
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
L Variablenwerte aus einer Methode übergeben Java Basics - Anfänger-Themen 2
E Arrays in einer ArrayList miteinander vergleichen Java Basics - Anfänger-Themen 12
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
Shadowrunner Variablen Gibt es eine Möglichkeit die Ziffern/Stellen einer Zahl fest zu legen? Java Basics - Anfänger-Themen 3
D remove Object von einer Liste von Obejcts Java Basics - Anfänger-Themen 3
FunkyPhil94 Wert in einer Lambda Funktion erhöhen Java Basics - Anfänger-Themen 3
T Aufruf der Methode einer Oberklasse, wenn sie in der Unterklasse überschrieben ist. Polymorphie. Java Basics - Anfänger-Themen 2
B Kommunikation mit Seriellen Schnittstellen + Integration einer lib Java Basics - Anfänger-Themen 1
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
P Welches SDK für das erstellen einer ausführbaren Datei? Java Basics - Anfänger-Themen 4
D Länge einer Liste aufrufen. Java Basics - Anfänger-Themen 19
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
B Alle Strings bis zu einer Maimallänge aufzählen, die Bedingung erfüllen Java Basics - Anfänger-Themen 13
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
T Fibonacci mit einer Hilfsmethode berechnen Java Basics - Anfänger-Themen 10
S Hilfe zu einer Aufgabe Java Basics - Anfänger-Themen 5
M Radius von einer ellipse bestimmen Java Basics - Anfänger-Themen 7
Say Fehlenden Code finden in einer while-Schleife? Java Basics - Anfänger-Themen 11
M Zufallszahl generieren mit einer linken und rechten Grenze Java Basics - Anfänger-Themen 3
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
G Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
W Objekte einer ArrayList in txt-datei schreiben mit Paths? Java Basics - Anfänger-Themen 2
S Best Practice Fragen zu Projektstruktur einer Datenbank-Abfrage-App (MVC) Java Basics - Anfänger-Themen 13
T Variable von Objekten in einer Methode überprüfen Java Basics - Anfänger-Themen 26
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
S Textausgabe in einer For-Schleife Java Basics - Anfänger-Themen 12
M Spezifischen Wert einer Zeile aus .txt Datei entnehmen Java Basics - Anfänger-Themen 15
B Popups mit Klicksabfangen zumAusfüllen einer .ods Datei Java Basics - Anfänger-Themen 0
M RandomAccessFile int und String gleichzeitig in einer Datei Java Basics - Anfänger-Themen 49
E Suchfunktion in einer Liste Java Basics - Anfänger-Themen 39
T ungeordnete Werte-Paare in einer Liste Java Basics - Anfänger-Themen 7
FireHorses Einen Command erst nach einer Chateingabe aktivieren Java Basics - Anfänger-Themen 1
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
F wie kann ich die Position des letzten Vokals innerhalb einer Zeichenkette ermitteln? Java Basics - Anfänger-Themen 5
H Kapselung protected aber in einer Kindklasse nicht zugänglich Java Basics - Anfänger-Themen 5
R Methoden Werte einer ArrayList als Parameter übergeben. Java Basics - Anfänger-Themen 4
B Den Dateipfad einer Java Datei durch Code in Selbiger finden? Java Basics - Anfänger-Themen 10
LilliCherry Array in einer Zeile ausgeben Java Basics - Anfänger-Themen 6
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
L Dauerhaftes Speichern einer Eingabe bei einer ArrayList Java Basics - Anfänger-Themen 26
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
stormyark Fehler beim überschreiben einer Variable Java Basics - Anfänger-Themen 1
H Kompliziertes Sortieren einer ArrayList mit Objekten(Sortieren nach X und Y) Java Basics - Anfänger-Themen 11
T Permanentes speichern von Objekten in einer ArrayList Java Basics - Anfänger-Themen 6
Saiko Zeilen einer Datei einlesen Java Basics - Anfänger-Themen 3
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
G zwei Instanzen einer Klasse Java Basics - Anfänger-Themen 29
sserio Prüfziffer einer ISBN Nummer herrausfinden. Java Basics - Anfänger-Themen 14
J Benennung einer mir unbekannten Java - Ausdrucksweise Java Basics - Anfänger-Themen 5
LFB In einer For-Schleife alles in einer Zeile ausgeben Java Basics - Anfänger-Themen 14
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
berserkerdq2 Wann soll ich den Stream schließen, wenn ich das in einer Methode habe? Java Basics - Anfänger-Themen 8
berserkerdq2 Wie gebe ich den Pfad zu einer Datei an, die in einem Ordner in Eclipse ist? Java Basics - Anfänger-Themen 1
M Variable in einer Schleife initialisieren Java Basics - Anfänger-Themen 46
D EinMalEins mithilfe einer for-Schleife und Array Java Basics - Anfänger-Themen 1
J int innerhalb einer Datei ändern Java Basics - Anfänger-Themen 1
D Hilfe bei einer Aufgabe mit for-Schleife Java Basics - Anfänger-Themen 6
Neuling47 Ich zerbreche mit den kopf an einer Aufgabe Java Basics - Anfänger-Themen 61
H Mit setter-Methode JLabel in einer andern Klasse ändern. Java Basics - Anfänger-Themen 40
J Zelleninhalt einer Jtable löschen Java Basics - Anfänger-Themen 2
Robert_Klaus Hamster java Simulation Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 5
stormyark 4 Bit in einer for-schleife funktioniert nicht Java Basics - Anfänger-Themen 3
F Werte in einer Arraylist Zählen Java Basics - Anfänger-Themen 2
M ArrayList mit einer Schleife befüllen Java Basics - Anfänger-Themen 2
A Ein Array bearbeiten und in einer anderen Methode nutzen Java Basics - Anfänger-Themen 6
A Ergebnis einer Methode bei einer anderen verwenden Java Basics - Anfänger-Themen 13
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
I Liste von Infos von einer eigenen Annotation in Liste speichern Java Basics - Anfänger-Themen 0
M Wie kann ich den Index i von einer LinkedList überprüfen? Java Basics - Anfänger-Themen 36
M Wie kann die Implementation einer Methode den Wert eines Attributs vermindern? Java Basics - Anfänger-Themen 3
M Wie verknüpfe ich eine Bedingung mit einer Methode ohne if-Verzweigung & Bedingungsoperator? Java Basics - Anfänger-Themen 2
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
javapingu Jeglichen Inhalt einer Textdatei nach Zeile n löschen Java Basics - Anfänger-Themen 8
D mehrere Berechnungen in einer Methode Java Basics - Anfänger-Themen 9
P Iterieren mit einer Foreach in Lambdaschreibweise und Counter. Java Basics - Anfänger-Themen 1
M Methoden Wert einer Variable geht verloren? Java Basics - Anfänger-Themen 6
W Wie ziehe ich von einer bestimmten Zahl, Zahlen ab, bis mein Ergebnis null beträgt? Java Basics - Anfänger-Themen 10
X Was ist der Unterschied zwischen materialisierten und nichtmaterialisierten Attributen einer Klasse? Java Basics - Anfänger-Themen 1
U Wie ein Attribut von einer Klassenmethode in der Klasse speichern= Java Basics - Anfänger-Themen 2
M Wie richte ich eine Diagonale an Robotern in einer World ein? Java Basics - Anfänger-Themen 15
YAZZ BlueJ Bewegung einer Figur im Kreis Java Basics - Anfänger-Themen 4
O Ich habe einen String und soll mit matches schauen, ob ein Buchstabe zu einer geraden ANzahl im String vorkommt, wie soll das gehen? Java Basics - Anfänger-Themen 7
A Verarbeiten einer Excel Datei durch das java-Programm Java Basics - Anfänger-Themen 3
B GUI extension mit einer Liste verbinden Java Basics - Anfänger-Themen 1
O Wie erstelle ich eine Instanz in einer Klasse für die ich die Instanz will? Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben