Java Variable Matrixmultiplikation

tobbs86

Cadet 1st Year
Registriert
Jan. 2009
Beiträge
10
Hallo,
zum Testen eines PC-Systems habe ich eine ganz normale Matrixmultiplikation in Java geschrieben.
Allerdings bin ich dabei über folgendes Problem gestoßen:

Ich möchte mit der Variablen n die Größe der Matrizen festlegen. Diese Erstelle ich dann mit dem Konstrukt
Code:
int a[][] = new int[n][n];
und fülle dann die Matrix mit Zufallszahlen

Code:
	for(i = 0; i < n; i++) {
			for(j = 0; j < n; j++) {
				a[i][j] = rnd.nextInt();
			}
		}

Leider bekomme ich dann beim Ausführen der Matrix Multiplikation eine Exception. Kann warum das passiert und wie ich das ändern kann.

Wenn ich die Matrix sofort mit Werten fülle, dann klappt alles wunderbar
Code:
int a[][] = {{5,6,7},{4,8,9},{3,2,1}};

Allerdings sollten die Matrizen bald die 1000x1000 Marke übersteigen und da wäre das händische Eintragen sehr fummelig.

Vielen Dank schon mal
 
So viel Text und trotzdem nicht viel mehr Informationen als „geht nicht“.

Leider bekomme ich dann beim Ausführen der Matrix Multiplikation eine Exception
*was* für eine Exception bekommst du da? Der Code der Matrixmultiplikation selbst würde wohl auch helfen. Glaskugeln sind leider gerade aus.
 
Zuletzt bearbeitet:
Hm, wenn ich mich recht erinnere, liegt es an dem 2-dimensionalen Array.
Code:
int a[][];
a = new int[n][]; //Hier die erste Dimension festlegen
for (int i = 0; i < n; i++) {
a[i] = new int[n]
}
Ein 2-dimensionales Array ist im Prinzip ein Array, was an jeder Stelle ein Array hat. Daher musst du zunächst das äußere anlegen, und dann jeden Wert initialisieren.
Hoffe das klappt so, ist schon n Weilchen her, aber probiers einfach mal aus.
 
Das war irgend ein Java Virtual Machine Error. Soweit ich gelesen habe, funktioniert das nicht ganz so, wie ich mir das gedacht habe. Hier noch einmal der Quellcode:
Code:
public class MatrixMultiply {
	


 
	public static void main(String[] args) {
		int n = 4;
		int i, j,k;
		//Zufallszahlengenerator
		Random rnd = new Random(); 
		
		System.out.println("Test");
		//Initialisierung
		int a[][] = new int[n][n]; //{{5,6,7},{4,8,9},{3,2,1}};
		int b[][] = new int[n][n]; //{{5,6,7},{4,8,9},{3,2,1}};	
		int c[][] = new int[n][n];


		//Füllen der Matrizen
		for(i = 0; i < n; i++) {
			for(j = 0; j < n; j++) {
				a[i][j] = rnd.nextInt();
				b[i][j] = rnd.nextInt();
			}
		}
		
		
		System.out.println("Start auf einer CPU:");	
		final long startZeit_1CPU = System.currentTimeMillis();   
		
		//Kern der Matrix Multiplikation
		for(i = 0; i < n; i++) {
			for(j = 0; j < n; j++) {
				for(k = 0; k < n; k++) {
					c[i][j] += a[i][k] * b[k][j];
				}
			}
		}

		final long endZeit_1CPU = System.currentTimeMillis();
   		final long dauer_1CPU = endZeit_1CPU - startZeit_1CPU;
    		System.out.println("...done");
		

		System.out.println("Dauer 1 CPU: "+dauer_1CPU+" ms");

 	 }
	

 }
 
Code:
//Zufallszahlengenerator
		Random rnd = new Random(); 
...

wegen dem Random fehlt entweder ne Klasse oder ein import.. wird bei mir als fehler angezeigt
...deswegen kann ich des nich laufen lassen

Random funktion fällt mir jetz spontan nur ein:

Code:
import java.[...].Math.*; //weiß jetz nich welches package des ist

....

double zufall = Math.random(); //und dann halt die zahl noch auf den jeweiligen benötigten bereich umrechnen....

so wär mein Ansatz
 
tobbs86 schrieb:
Das war irgend ein Java Virtual Machine Error. Soweit ich gelesen habe, funktioniert das nicht ganz so, wie ich mir das gedacht habe. Hier noch einmal der Quellcode:
Warum meinst du sollten wir uns damit beschäftigen, wenn dir deine Zeit zu kostbar ist, einfach eine Fehlermeldung abzutippen?
 
Darii schrieb:
Warum meinst du sollten wir uns damit beschäftigen, wenn dir deine Zeit zu kostbar ist, einfach eine Fehlermeldung abzutippen?

Sorry, ich bin neu hier im Forum und ich kann ja nicht wissen, dass diese nichtsaussagende Fehlermeldung so wichtig ist. Also hier ist sie:

Code:
          Uncaught Exception in MatrixMultiply
              java.lang.VirtualMachineError
          at MatrixMultiply 0xa

Achso, als Import für den Zufallsgenerator benutze ich die
Code:
import java.util.Random;

Wie gesagt, es liegt definitiv am Initialisieren der Matrizen, wenn ich sie sofort mit Werten fülle, dann läuft das Programm wunderbar durch, aber so
Code:
               int a[][] = new int[n][n];
		int b[][] = new int[n][n];	
		int c[][] = new int[n][n];

bricht er während der Laufzeit mit der oben genannten Exception ab.

Ich hoffe mir kann jetzt jemand helfen.

Grüße
 
Wenn ich deinen oben geposteten Code bei mir ausführe, läuft er ohne Fehler durch.

Benutz mal bitte folgenden Code:
Code:
public static void main(String[] args) {
    try {
      int n = 4;
      int i, j,k;
      //Zufallszahlengenerator
      Random rnd = new Random(); 

      System.out.println("Test");
      //Initialisierung
      int a[][] = new int[n][n]; //{{5,6,7},{4,8,9},{3,2,1}};
      int b[][] = new int[n][n]; //{{5,6,7},{4,8,9},{3,2,1}}; 
      int c[][] = new int[n][n];


      //Füllen der Matrizen
      for(i = 0; i < n; i++) {
        for(j = 0; j < n; j++) {
          a[i][j] = rnd.nextInt();
          b[i][j] = rnd.nextInt();
        }
      }


      System.out.println("Start auf einer CPU:"); 
      final long startZeit_1CPU = System.currentTimeMillis();   

      //Kern der Matrix Multiplikation
      for(i = 0; i < n; i++) {
        for(j = 0; j < n; j++) {
          for(k = 0; k < n; k++) {
            c[i][j] += a[i][k] * b[k][j];
          }
        }
      }

      final long endZeit_1CPU = System.currentTimeMillis();
      final long dauer_1CPU = endZeit_1CPU - startZeit_1CPU;
      System.out.println("...done");


      System.out.println("Dauer 1 CPU: "+dauer_1CPU+" ms");
    }
    catch (VirtualMachineError ex){
      ex.printStackTrace();
      System.out.println(ex.getMessage());
    }

  }
Die einzige Änderung zu deinem Code ist der abgefangene Fehler VirtualMachineError.
Poste danach bitte mal die Fehlerausgabe.
 
Bei mir klappts ohne Probleme.
Vielleicht das JDK neu aufsetzen?
 
tobbs86 schrieb:
Sorry, ich bin neu hier im Forum und ich kann ja nicht wissen, dass diese nichtsaussagende Fehlermeldung so wichtig ist.
Klar kannst du das wissen, ich habs dir doch gleich am Anfang schon geschrieben. Abgesehen davon, sollte sich das eigentlich von selbst verstehen, dass man zu einem Fehler auch eine adäquate Fehlerbeschreibung liefert. Und wenn der Computer dir schon gnädiger Weise eine Fehlermeldung ausgibt, könnte man auch von selbst auf die Idee kommen, dass die wichtig sein könnte.

Und poste beim nächsten Mal bitte auch Code der funktioniert und keinem bei dem man sich noch importe dazudenken darf.

PS: Falls du dich fragst warum ich so unfreundlich bin: Ich hab dir gleich im ersten Post gesagt, das das wichtig ist, das zu ignorieren finde ich auch unfreundlich.
 
Zuletzt bearbeitet:
Darii schrieb:
Klar kannst du das wissen, ich habs dir doch gleich am Anfang schon geschrieben. Abgesehen davon, sollte sich das eigentlich von selbst verstehen, dass man zu einem Fehler auch eine adäquate Fehlerbeschreibung liefert. Und wenn der Computer dir schon gnädiger Weise eine Fehlermeldung ausgibt, könnte man auch von selbst auf die Idee kommen, dass die wichtig sein könnte.

Und poste beim nächsten Mal bitte auch Code der funktioniert und keinem bei dem man sich noch importe dazudenken darf.

PS: Falls du dich fragst warum ich so unfreundlich bin: Ich hab dir gleich im ersten Post gesagt, das das wichtig ist, das zu ignorieren finde ich auch unfreundlich.

Ich finde es trotzdem nicht richtig, einem Neuling auf diese Art und Weise auf seine Fehler hinzuweisen. Das kann man doch auch in einem freundlichen "Ton" machen. Immerhin hast du ja in meinem Thread 4 mal gepostet ohne mir in irgend einer Art und Weise zu helfen, während es andere probiert haben.
Der Fehler, den die JVM mir ausgab, war meiner Programmiererfahrung nach nichtsaussagend, deswegen habe ich erstmal darauf verzichtet ihn hier anzugeben.

Naja zum Thema: Also wenn der Code bei anderen läuft, dann kann es ja nur an der JVM liegen. Da werd ich wohl heute doch mal das JDK neu aufsetzen. Danke an alle, die mir geholfen haben...
 
Zurück
Oben