# Gauss Elimination oder wie ich wahnsinnig wurde.



## lobotaro (8. Nov 2008)

Ja, hallo erstmal.

Die Aufgabenstellung lautet wie folgt: 
- ich habe 2 Arrays, eines für eine Matrix, eines für den dazugehörigen Vektor.
- Der Benutzer soll nun beliebige double-Werte eingeben, die dann in die Matrix und den Vektor eingeordnet werden sollen, als Beispiel wurde folgendes angegeben:



> > java GaussElimination 1.9 2.36 3.13 4.8 5.2 6.74 7.94 8.11 9.9 10 11 12.7
> 1.9 2.36 3.13
> 5.2 6.74 7.94
> 9.9 10.0 11.0
> 4.8 8.11 12.7



Soweit is das ja schon ganz supi toll. Problem an der Sache, meine Programmiererfahrung beträgt 3 Wochen und die Aufgabe ist eindeutig zu schwer für mich.

Was ich bisher habe:


```
public class GaussElimination {

	static double[][] matrix;
	static double[] vector;
	
	public static void main(String[] args) {
		convertCoefficients(args);

	}
	
	public static void convertCoefficients(String[] args) {
		double[] a;
		a = new double[args.length];
		
		// Anzahl der Eingabewerte
		int n = 1;
		for (int i = 0; i < args.length; i++) {
			n++;
		}
		System.out.println("Anzahl der eingegeben Werte: " + n);
		
		// Anzahl der Zeilen/Spalten in der Matrix
		int a1 = 0;					
		int b = n - (a1 * a1);			
		for (int i = 0; i <= b; i++) {	
			b = n - (a1 * a1);
			a1++;
		}
		System.out.println(b + " * " + b + " Matrix");
		System.out.println("Zeilen insgesamt mit Vektor: " + a1);
		
		double[][]matrix = new double[b][b];
		double[]vector = new double[b];
		
	}
}
```

Die System.out's habe ich nur mal für mich selber für Zwischenergebnisse eingefügt und da taucht auch schon ein tolles Problem auf...gebe ich 12 Werte ein werden 12 gezählt und eine 3 x 3 Matrix plus Vektor-Zeile erkannt. bei 20 Werten werden 20 gezählt und eine 4 x 4 Matrix plus Vektor erkannt. Soweit, so richtig...nur...gebe ich 6 Werte ein, werden nicht wie erwartet 6 gezählt mit einer 2 x 2 Matrix plus Vektor, nein...es werden 7 Werte gezählt und ich bekomme eine -2 x -2 Matrix.

Nicht, dass ich sowieso schon seit Tagen am verzweifeln bin, weil ich einfach nicht weiß, wie ich nun die Werte in die Arrays packen soll gibt mir dieses Problem nun den Rest. 

Ich hoffe mir kann jemand helfen, und das mit möglichst einfachen Erklärungen, wäre echt super. [/code]


----------



## lobotaro (8. Nov 2008)

Ha, okay...inzwischen brauch ich nur noch einen kleinen Denkanstoß...

Aktueller Code:

```
public class GaussElimination {

	static double[][] matrix;
	static double[] vector;
	
	public static void main(String[] args) {
		convertCoefficients(args);
	}
	
	public static void convertCoefficients(String[] args) {
		double[] a;
		a = new double[args.length];
		
		// Anzahl der Eingabewerte
		int ewerte = 0;
		for (int i = 0; i < args.length; i++) {
			ewerte++;
		}
		System.out.println("Anzahl der eingegeben Werte: " + ewerte);
		
		// Anzahl der Zeilen/Spalten in der Matrix
		int a1 = 0;					
		int n = ewerte - (a1 * a1);			
		for (int i = 0; i < n; i++) {	
			n = ewerte - (a1 * a1);
			a1++;
		}
		System.out.println(n + " * " + n + " Matrix");
		System.out.println("Zeilen insgesamt mit Vektor: " + a1);
		
		double[][]matrix = new double[n][n];
		double[]vector = new double[n];
		
		// cast von char args nach double
		double[] b;
		b = new double[args.length];
		for (int i = 0; i < args.length; i++) {
		b[i] = Double.valueOf(args[i]).doubleValue();
		}
		
		// Wertzuweisung
		for(int i = 0; i < n; i++) {
			matrix[i][0] = b[i];
			System.out.print(matrix[i][0] + " ");
		}
		
		System.out.println();
		
		for(int i = 0; i <= ewerte; i++, n = n+a1) {
			vector[i] = b[n];
			System.out.print(vector[i] + " ");
		}
	}
}
```

Damit kann ich mir den Vektor und immerhin die erste Zeile der Matrix korrekt anzeigen lassen, allerdings komm ich jetzt nicht so ganz drauf, wie ich die restlichen Zeilen korrekt ausgeben lassen kann. Hm...


----------



## Landei (8. Nov 2008)

Denkanstoß:

```
import java.util.Arrays;

public class GaussElimination {

   static double[][] matrix;
   static double[] vector;

   public static void main(String[] args) {
      convertCoefficients(args);
   }

   public static void convertCoefficients(String[] args) {
      System.out.println("Anzahl der eingegeben Werte: " + args.length);
      int n = (int) Math.sqrt(args.length);
      if(n*(n+1) !=  args.length) {
          System.out.println("Keine quadratische Matrix und Vektor eingegeben!!!");
          System.exit(1);
      }
      System.out.println(n + " * " + n + " Matrix");

      matrix = new double[n][n];
      vector = new double[n];

      // cast von String args nach double
      double[] b = new double[args.length];
      for (int i = 0; i < args.length; i++) {
         b[i] = Double.valueOf(args[i]).doubleValue();
      }

      // Wertzuweisung
      for(int i = 0; i < n*n; i++) {
         matrix[i/n][i%n] = b[i];
      }
      for(int i = n; i < args.length; i++) {
         vector[i%n] = b[i];
      }
      
      //Ausgabe
      System.out.println("Matrix:");
      for(int row = 0; row < n; row++) {
          System.out.println(Arrays.toString(matrix[row]));
      }
      System.out.println("Vektor:");
      System.out.println(Arrays.toString(vector));
   }
}
```


----------



## Ariol (8. Nov 2008)

Bau noch eine 2.te while-Schleife drum.

Damit du auch Zeilenweise weiterkommst.


----------



## lobotaro (8. Nov 2008)

Landei: Ich habe mal aus Spaß deinen Code einfach versucht zu kompilieren und bekam folgendes: 



> javac SucheAlter.java
> SucheAlter.java:1: cannot find symbol
> symbol  : class Arrays
> location: class java.util
> ...



Nicht wegen dem Dateinamen wundern  Nee, aber war nicht das was ich suchte, da ich keine Fremdbibliotheken verwenden soll.

Ariol: Ja, das versuch ich gerade, aber so ganz krieg ich das auch noch nicht hin. Ich verzweifel wirklich noch an der Aufgabe...schon traurig irgendwie...


----------



## Landei (8. Nov 2008)

du musst die Importanweisung schon mitschreiben. Arrays ist keine "Fremdbibliothek" sondern eine ganz normale Java-Klasse, genauso wie String (und den nimmst du ja auch). Aber wenn dir das nicht gefällt, kannst du dir den Code für die formatierte Ausgabe aus Arrays ja auch "borgen":

```
public static String toString(Object[] a) {
        if (a == null)
            return "null";
        int iMax = a.length - 1;
        if (iMax == -1)
            return "[]";

        StringBuilder b = new StringBuilder();
        b.append('[');
        for (int i = 0; ; i++) {
            b.append(String.valueOf(a[i]));
            if (i == iMax)
                return b.append(']').toString();
            b.append(", ");
        }
    }
```


----------



## lobotaro (8. Nov 2008)

Boah, also das is mir für meinen Wissenstand derzeit echt noch viel zu schwierig, dann versuch ich's doch lieber mit einer zweiten Schleife außen rum, aber irgendwie klappt das immernoch nicht so richtig.

Mal was ich bisher habe, vermutlich total lustig anzuschauen für Leute die mehr Ahnung haben aber hey...


```
// Wertzuweisung
		int k = 0;
		int i = 0;
		int j = 0;
		while (j < n & k <= ewerte) {
			while (i < n) {
				matrix[i][j] = b[i + k];
				System.out.print(matrix[i][j] + " ");
				i++;
			}
		k += a1;
		j++;
		}
		System.out.println();
		
		for(int g = 0; g <= ewerte; g++, n = n+a1) {
			vector[g] = b[n];
			System.out.print(vector[g] + " ");
		}
```

Ich bin das auf dem Papier durchgegangen, und die Matrix müsste korrekt aufgefüllt werden, aber mir wird weiterhin nur die erste Zeile ausgegeben und ich weiß nicht was ich da noch probieren könnte...


----------



## nixcheck (9. Nov 2008)

Also diese Aufgabe kommt mir sehr bekannt vor^^

lobotaro, du bist nicht zufällig von der Uni Erlangen? 

Beim Problem selbst kann ich dir leider nicht weiterhelfen, weil ich noch weniger peil hab als du :/


----------



## lobotaro (9. Nov 2008)

Haha, erwischt  Ja nee, beruhigt mich aber irgendwie, dass ich nicht der einzige bin, den diese Aufgabe killt...


----------



## Landei (9. Nov 2008)

> Boah, also das is mir für meinen Wissenstand derzeit echt noch viel zu schwierig, dann versuch ich's doch lieber mit einer zweiten Schleife außen rum, aber irgendwie klappt das immernoch nicht so richtig.


Was gefällt dir nicht an meinem Code? Die Arrays-Klasse brauchst du doch gar nicht für die Wertzuweisung, und selbige ist einfach und funktioniert einwandfrei. Das einzige, was du noch wissen musst, ist dass bei ints die /-Division nur den ganzzahligen Anteil liefert und dass der %-Operator den Rest der Division ermittelt. Wenn du also ein 3x3 Array hast, und der Schleifenindex ist 5, liefert der 5/3 = 1 als Zeile (also die zweite Zeile, da wir ja mit 0 anfangen, und 5 % 3 = 2 (also die dritte Spalte). Alles klar?


----------



## lobotaro (9. Nov 2008)

Nee leider nicht alles klar, ich versteh deinen Code von Grund auf einfach nicht...z.B. versteh ich nicht wie ich die "Importanweisung mitschreiben" soll, wenn doch "import bla bla bla" für mich schon eine Importanweisung ist...und wo...außerdem weiß ich nicht welche Teile meines Codes ich durch deinen zweiten geposteten Code ersetzen soll/muss/kann und was mir dann noch fehlt. Es ist mir einfach noch viel zu kompliziert, wo ich doch bisher nur das Quadrat einer eingegeben Zahl und solche Scherze berechnet hab.

Wie gesagt, mir wäre WEITAUS lieber wenn man mir einfach sagt was ich an meiner zuletzt geposteten Schleife noch ändern müsste, damit es endlich passt.


----------



## Landei (9. Nov 2008)

So'n Blödsinn, das Programm unter "Denkanstoß" funktioniert genau so wie es dasteht, aber bitte...

```
int j = 0;
      while (j < n) {
          int i = 0;
          while (i < n) {
            matrix[i][j] = b[i + n*j];
            System.out.print(matrix[i][j] + " ");
            i++;
         }
         j++;
      }
      System.out.println();
      
      for(int g = 0; g <= n; g++) {
         vector[g] = b[n*n + g];
         System.out.print(vector[g] + " ");
      }
```


----------



## lobotaro (9. Nov 2008)

Nee, tut mir leid aber bei mir gab's beim kompilieren eine Fehlermeldung, wie oben beschrieben.

Ok gut...jetzt gibt's erstmal ein Danke, weil mir zumindest mal alle Werte ausgegeben werden 

Aber, zwei kleine Probleme noch...hier erstmal der aktuelle Code:


```
public class GaussElimination {

	static double[][] matrix;
	static double[] vector;
	
	public static void main(String[] args) {
		convertCoefficients(args);
	}
	
	public static void convertCoefficients(String[] args) {
		double[] a;
		a = new double[args.length];
		
		//Anzahl Eingabewerte
		int ewerte = 0;
		for (int i = 0; i < args.length; i++) {
			ewerte++;
		}
		
		//Anzahl Zeilen/Spalten
		int a1 = 0;					
		int n = ewerte - (a1 * a1);			
		for (int i = 0; i < n; i++) {	
			n = ewerte - (a1 * a1);
			a1++;
		}
		
		double[][]matrix = new double[n][n];
		double[]vector = new double[n];
		
		//Cast
		double[] b;
		b = new double[args.length];
		for (int i = 0; i < args.length; i++) {
		b[i] = Double.valueOf(args[i]).doubleValue();
		}
		
		//Wertzuweisung Matrix
		int j = 0;
		while (j < n) {
			int i = 0;
			while (i < n) {
				matrix[i][j] = b[i + a1*j];
				System.out.print(matrix[i][j] + " ");
				i++;
			}
		j++;
		}
		System.out.println();
		
		//Wertzuweisung Vektor
		for(int g = 0; g <= ewerte; g++, n = n+a1) {
			vector[g] = b[n];
			System.out.print(vector[g] + " ");
		}
	}
}
```

Und nun hier, was in der Konsole passiert:


> $ java GaussElimination 1.9 2.36 3.13 4.8 5.2 6.74 7.94 8.11 9.9 10 11 12.7
> 1.9 2.36 3.13 5.2 6.74 7.94 9.9 10.0 11.0
> 4.8 8.11 12.7 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 15
> at GaussElimination.convertCoefficients(GaussElimination.java:53)
> at GaussElimination.main(GaussElimination.java:7)



Jetzt die Fragen...woher und warum kommen diese Fehlermeldungen und...wie mache ich es, dass mir die Matrix nicht wie oben als Zeile sondern eben als Matrix (wie im Ausgangsposting zu sehen) ausgegeben wird?


----------



## r4iki (9. Nov 2008)

warum kommt mir die aufgabe nur so bekannt vor? xD
ich habs zwar ganz anders als du, aber bei mir gehts auch net, bekomm auch so ne fehlermeldung und hab keinen plan, warum, hat wohl irgendwas damit zu tun, dass ich das array über ne for schleife abrufe, irgendwie geht des net. also sry, kann dir auch net weiterhelfen, aber sobald ich was weiß post ich mal nen denkanstoß ^^


----------



## Quark (9. Nov 2008)

Joa, sitze ebenfalls seit Stunden an dem Teil und hab noch keine Lösung. Find das irgendwie hart das die erste richtige aufgabe zu klassen und arrays gleich son hammer is. Hoffe der Schwierigkeitsgrad der Aufgaben steigt net weiter exponentiell so an ^^


----------



## lobotaro (9. Nov 2008)

Wir sollten morgen eine Selbsthilfegruppe starten 

Ich hätte nur gerne endlich mal diese Aufgabe fertig, damit ich mich vollkommen auf die nächste konzentrieren kann, bei der ich selbstverständlich auch nicht mehr weiter komme...schon böse alles...


----------



## nikky (9. Nov 2008)

//Wertzuweisung Matrix 

      for (int j=0;j < n;j++) { 
         for (int i=0;i < n;i++) { 
            matrix_[j] = b[i + a1*j]; 
            System.out.print(matrix[j] + " "); 
            } 
            System.out.println(); 
      } 
      System.out.println(); 

Wertzuweisung vom Vektor bekomm ich irgendwie net hin.._


----------



## lobotaro (9. Nov 2008)

Wertzuweisung vom Vektor kannst du ja aus meinem Code klauen, würde dann auch stilistisch zu deinem passen.


----------



## Quark (9. Nov 2008)

Okay, mit der Wertzuweisung von nikky in den Code von lobo~ eingebaut krieg ich die richtige Darstellung. Nun müssen nurnoch die Fehler am Ende verschwinden.

ArrayIndexOutOfBounds

heißt das irgendein Array zu klein is für die eingegebenen Werte, oder?


----------



## Marco13 (9. Nov 2008)

Das " :wink: " bei der "Selbsthilfegruppe" ist ungerechtfertigt: Ihr seid ja offenbar alle an der selben Uni. Schließt euch per PN kurz, und trefft euch, und besprecht das ganze mal.


----------



## Quark (9. Nov 2008)

An sich gut, aber heute is sonntag und morgen um 10 uhr müssen wir das abgegeben haben, also nützt das hier nichtmehr so viel  wir könnten ja ne große msn/icq-convo machen, haha ^^


----------



## Marco13 (9. Nov 2008)

Dann können sich ja bei den späteren Aufgaben immerhin noch (rechtzeitig vorher!!!) diejenigen treffen, die nicht schon wegen DIESER Aufgabe durch's Raster fallen .... :roll:


----------



## ar (9. Nov 2008)

Die Anzahl der Eingabewerte braucht ihr gar nicht. Man muss:
1. Zeilenzahl n berechnen (Tipp: n*(n+1) = args.length, da quadr. Gleichung)
2. passenden vector & matrix anlegen
3. strings -> double konvertieren, dafür die args in einer extra (eindimensionalen) Reihung speichern
4. Wertzuweisen aus der extra Reihung mittels zwei Schleifen (Hinweis: man benötigt noch eine Variable die Stelle der e.R. angibt, diese muss dementsprechend auch inkrementiert werden):
* Die Äußere gibt [*][] der Matrix an und füllt nach jeder Zeile dann die nächste vector-Stelle.
* Die Innere gibt [][*] der Matrix an.
5. Ausgabe von matrix geht nach (fast) selbigen for-Schleifenschema wie 4., vector braucht dann noch eine einfache for-Schleife selber.


----------



## ar (9. Nov 2008)

Wäre übrigens selber über Hilfe bei der 3.4 dankbar, die schein ich partout nicht lösen zu können...


----------



## r4iki (9. Nov 2008)

also über ne gruppe bilden wär kuhl, dann könnwa uns imma helfen wennwa es allein net schaffn 
wir sollten mal icq nummern austauschen^^


----------



## lobotaro (9. Nov 2008)

Wäre definitiv eine sehr gute Idee...nur hier so öffentlich die Nummern reinposten is vielleicht nich so cool 

Ich schreib mir meine aber mal auf, wer mich morgen sieht (lange Haare, Zopf (wobei das ja eh standard is ) und höchstwahrscheinlich weißer Nike Kapuzenpulli, ansonsten schwarzer Kap.pulli von irgendner obskuren Band die keine Sau kennt ) kann mich ja mal anhaun...bin auch direkt vorher in der Mathe C1 Übung...

Zusammenfassung: Hässlicher Informatiker sucht Freunde...


----------



## Guest (9. Nov 2008)

Heyho, alles ich peil das hier auch nicht, und da dieses nächste Aufgabenblatt noch vieeel schlimmer ist, weiß ich ehrlich gesagt nicht, wie ich das schaffen soll. Finde das für Leute die vorher noch nie programmiert haben ziemlich unschaffbar, wenn sich also ein paar Leute finden würden um sich dann gemeinsam zu beraten, wär ich auf jeden Fall dabei.^^ Naja erstmal morgen in den Intensivübung...^^

Aufschreiben...^^ Icq Nummern kann man auswendig.^^


----------



## Quark (9. Nov 2008)

okay,hab ganz neu angefangen und bin mit teilweise hier mal spicken soweit gekommen, dasses alles komplett richtig anzeigt...

nur nicht wenn ich ne "falsche" anzahl an parametern anfangs eingeb, dann kommt der outofbound-error 

weiß einer wie man die parameter die zuviel sind ignorieren kann?


----------



## r4iki (9. Nov 2008)

das ist das mit dem hinweis, dass du eine for schleife erstellen sollst, der dir dann die maximal mögliche anzahl an parametern ausspuckt. nehm dir dabei zuhilfe, dass du eine nxn, d.h. i*i matrix hast


----------



## Quark (9. Nov 2008)

Danke, hatte das am Anfang irgendwie machen wollen aber dann vergessen und nur unvollständig hingeschrieben und nu richtig ergänzt ^^ Bin sogar ein bischen stolz auf mich nu


----------



## r4iki (9. Nov 2008)

jo ging mir genauso, hab das im ganzen gewühl dann total vergessen gehabt ^^ xD


----------



## Quark (9. Nov 2008)

Hm, bei der 3.4 versteh ich garnet welche 2 Konstruktoren die meinen. Wollen die net einfach einen der die 2 Parameter die man übergibt als x und y einträgt?


----------



## aha (9. Nov 2008)

moin zusammen. Ich zähle mich auch zu den glücklichen. Ich bin jetzt auch in etwa soweit wie ihr, aber kriege auch diesen Outofbounds error und versuche mich gerade an dieser for schleife...

Zum Thema 3.4 bin ich mir auch nicht sicher @ Quark...


----------



## Quark (10. Nov 2008)

inzwischen arbeite ich mich stück für stück vorran, aber komisch ohne ausgabe was zu programmieren. und eclipse zeigt seit vorhin irgendnen fehler bei mir an wenn ich das zeile für zeile ablaufen lassen will... ^^


----------



## aha (10. Nov 2008)

quark hast du ne icq nummer unter der man sich mal mit dir kurzschließen kann? Wenn ja meld dich mal bitte bei mir #190187267


----------



## Landei (10. Nov 2008)

> Nee, tut mir leid aber bei mir gab's beim kompilieren eine Fehlermeldung, wie oben beschrieben.



Ist zwar schon ein wenig her, aber nochmal zum Mitmeißeln:
Wenn du das 
	
	
	
	





```
import java.util.Arrays;
```
 ausnahmsweise *nicht* wegläßt, kompiliert und läuft das Programm. Wie kann man denn nur so... ach, ich lass es besser - elimiere deinen Gauss doch selber


----------



## lobotaro (10. Nov 2008)

Also entschuldige mal...ich hatte deinen Code inklusive "import blabla" 1 zu 1 in Eclipse kopiert und gespeichert.

Glaub doch was du willst...

Ich habs gerade nochmal versucht, diesmal werde ich von Eclipse aufgefordert den "unused import" zu entfernen...

Alternativ kann ich bei "System.out.println(Arrays.toString(matrix[row]));" das Argument entfernen damit es zu toString passt.

Aber nee, ich bin ja so... mh...ja was denn nun?


----------



## Landei (10. Nov 2008)

Das Programm funktioniert einwandfrei in NetBeans und JBuilder (gerade nochmal probiert).

Was eventuell noch sein kann ist, dass Eclipse Probleme hat wenn das Programm in der Default-Package liegt, packe es mal in ein definiertes Package...


----------

