Erstes Programm: Matrizen Multiplikation

Bitte aktiviere JavaScript!
Hallo, bin letzten Uni-bedingt von C auf Java umgesprungen und muss ein Programm schreiben in dem ich zwei Matrizen multipliziere und dann formatiert ausgeben muss. Vor allem habe ich Probleme mit den Klassen und dem definieren der Matrix. Hier ist das was ich bis jetzt habe:

Java:
//definiere Matrix A
double A[3][3] = null ;
int A[1][1] = 1 ;
int A[1][2] = 2 ;
int A[1][3] = 3 ;
int A[2][1] = 4 ;
int A[2][2] = 5 ;
int A[2][3] = 6 ;
int A[3][1] = 7 ;
int A[3][2] = 8 ;
int A[3][3] = 9 ;

//definiere Matrix B
double[2][3] B = null ;
int B[1][1] = 1 ;
int B[1][2] = 2 ;
int B[2][1] = 3 ;
int B[2][2] = 4 ;
int B[3][1] = 5 ;
int B[3][2] = 6 ;


public class Matrix {
    public static double[][] matMult(double[][] A, double[][] B) {
        double[][] result = null ; //Ergebnis Matrix wird definiert
        
        if( A[0].length != B.length) {
            return null ;
        } //Es wird geprüft ob Matrixmultiplikation möglich ist
        
        int linesA = A.length ;
        int columnsA = A[0].length ;
        int columnsB = B[0].length ;
        
        result = new double[linesA][columnsB] ; //Größe des Ergebnis wird definiert anhand Zeilenlänge A * Spaltenlänge B
        
        for( int i = 0 , i < linesA , i++) {
            for( int j = 0 , j < columnsB , j++ ) { //Wir laufen der Zeile i der Erebnismatrix entlang
                result[i][j] = 0 ;
                for( int k = 0 , k < columnsB , k++ ) { //Wir berechnen für jedes Feld[i][j] der Ergebnismatrix den Wert aus A und B
                    result[i][j] += A[i][k] * B[k][j] ;
                }
            }
        }
        
        return result ;
    }
    public static void main() {
        result = matMult( A , B ) ;
        for( int j = 0 , j < result[0].length , j++ ) {
            for( int i = 0 , i < result.length , i++ ) {
                System.out.printf("\n %t \t") ;
            }
        }
    }
}
Am Anfang erhalte ich bei jeder Zeile für das zuschreiben der Werte von A und B den error: class, interface, or enum expected. Es werden auch für meine for-Schleifen jede Menge errors angezeigt (z.B. expected ";" zwischen "k" und "< columnsB"). Mit dem Aufrufen der Matrizenwerte über
Java:
"result[i][j]"
zeigt es auch sehr viele Errors an. Ich weiß dass der Code sehr anfängerlich ist, aber das bin ich nunmal auch, ich habe echt Probleme die errors der Konsole zu interpretieren.
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Java:
//definiere Matrix A
double A[3][3] = null ;
int A[1][1] = 1 ;
int A[1][2] = 2 ;
int A[1][3] = 3 ;
int A[2][1] = 4 ;
int A[2][2] = 5 ;
int A[2][3] = 6 ;
int A[3][1] = 7 ;
int A[3][2] = 8 ;
int A[3][3] = 9 ;

//definiere Matrix B
double[2][3] B = null ;
int B[1][1] = 1 ;
int B[1][2] = 2 ;
int B[2][1] = 3 ;
int B[2][2] = 4 ;
int B[3][1] = 5 ;
int B[3][2] = 6 ;
Oh je ;-) ein primitiver Datentyp (int, double...) kann nicht null sein. Zudem Ist ein Array immer 0-basiert, ich sehe hier aber keine einzige 0 als Index.

Du willst eher sowas...

Java:
// eine Möglichkeit
double[][] A = new double[3][3] {
  {1, 2, 3},
  {4, 5, 6},
  {7, 8, 9}
};

// eine andere Möglichkeit
double[][] B = new double[3][3];
B[0][0] = 1;
// ...
B[2][2] = 9;
Kleiner Tipp, Stell dir ein Array wie ein Regal vor. Mit new double[3][3] baust du zuerst das Regal auf, in diesem Fall hast es 3x3 Fächer. Vorher kannst du nichts reinstellen.
 
Danke, habe das schon mal geändert und auch die Matrix "result" richtig definiert, bei Matrix A und B zeigt es aber immer noch den "error: class, interface, or enum expected" an, ich habe auch schon überprüft ob ich zu viele geschweifte Klammern habe, aber es passt alles. Bei den For-Schleifen zeigt es immer noch mehrere Errors an. Eventuell habe ich da auch was falsch gemacht weil ich noch zu sehr an den Syntax von C gewöhnt bin.
 
Du deklarierst sowohl A als auch B außerhalb einer Klasse. Schieb die Deklaration unter die Zeile public class Matrix {
Eventuell habe ich da auch was falsch gemacht weil ich noch zu sehr an den Syntax von C gewöhnt bin.
In c sieht eine for - Schleife doch aus wie in Java?
Java:
for(int i = 0; i < linesA; i++) {
   ...
}
 
Ok ich habe nochmal etwas rumversucht, jetzt kriege ich nur noch Errors bei der Definition der Matrizen.

Java:
    //steht alles innerhalb einer Klasse
    //definiere Matrix A
    double[][] A = new double[3][3] ;
    A[0][0] = 1;
    A[0][1] = 2;
    A[0][2] = 3;
    A[1][0] = 4;
    A[1][1] = 5;
    A[1][2] = 6;
    A[2][0] = 7;
    A[2][1] = 8;
    A[2][2] = 9;


    //definiere Matrix B
    double[][] B = new double[2][3] ;
    B[1][1] = 1;
    B[1][2] = 2;
    B[2][1] = 3;
    B[2][2] = 4;
    B[3][1] = 5;
    B[3][2] = 6;
Jetzt kriege ich aber den error

Code:
Matrix.java:5: error: ']' expected
        A[0][0] = 1;
          ^
Matrix.java:5: error: ';' expected
        A[0][0] = 1;
           ^
Matrix.java:5: error: illegal start of type
        A[0][0] = 1;
            ^
Matrix.java:5: error: <identifier> expected
        A[0][0] = 1;
             ^
Matrix.java:5: error: ';' expected
        A[0][0] = 1;
              ^
Matrix.java:5: error: illegal start of type
        A[0][0] = 1;
                ^
Matrix.java:5: error: <identifier> expected
        A[0][0] = 1;
und das für jede Zeile in welcher ich versuche den Feldern der Matrizen einen Wert zuzuschreiben.
In c sieht eine for - Schleife doch aus wie in Java?
Java:
for(int i = 0; i < linesA; i++) {
   ...
}
Ja, das war ein dummer Fehler meinerseits, habe anstatt vom Semikolon Kommata benutzt.
 
Die Deklaration und Initialisierung kannst Du innerhalb der Klasse machen.
Die Zuweisung einzelner Elemente muss aber in einer Methode stehen.
Ich empfehle die Matrizen in der main-methode zu definieren. Hierbei würde ich die erste Variante von #2 benutzen.
 
Ok, ich bin jetzt sehr nahe dran es funktioniert:
Java:
public class Matrix {
    public static double[][] matMult(double[][] A, double[][] B) {
        
        int linesA = A.length ;
        int columnsA = A[0].length ;
        int columnsB = B[0].length ;
        
        double[][] result = new double[linesA][columnsB] ; //Größe des Ergebnis wird definiert anhand Zeilenlänge A * Spaltenlänge B
        
        if( A[0].length != B.length) {
            return null ;
        } //Es wird geprüft ob Matrixmultiplikation möglich ist
        
        for( int i = 0 ; i < linesA ; i++ ) {
            for( int j = 0 ; j < columnsB ; j++ ) { //Wir laufen der Zeile i der Erebnismatrix entlang
                result[i][j] = 0 ;
                for( int k = 0 ; k < columnsB ; k++ ) { //Wir berechnen für jedes Feld[i][j] der Ergebnismatrix den Wert aus A und B
                    result[i][j] += A[i][k] * B[k][j] ;
                }
            }
        }
        
        return result ;
    }
    public static void main(String[] args) {
        
        //Matrix A wird definiert
        double[][] A = new double[3][3] ; 
        A[0][0] = 1;
        A[0][1] = 2;
        A[0][2] = 3;
        A[1][0] = 4;
        A[1][1] = 5;
        A[1][2] = 6;
        A[2][0] = 7;
        A[2][1] = 8;
        A[2][2] = 9;
    
        //Matrix B wird definiert
        double[][] B = new double[3][2] ;
        /*B[0][0] = 1;
        B[0][1] = 2;
        B[0][2] = 3;
        B[1][0] = 4;
        B[1][1] = 5;
        B[1][2] = 6;
        B[2][0] = 7;
        B[2][1] = 8;
        B[2][2] = 9; */
        
        B[0][0] = 1;
        B[0][1] = 2;
        B[1][0] = 3;
        B[1][1] = 4;
        B[2][0] = 5;
        B[2][1] = 6; 
        
        double[][] result = matMult( A , B ) ;
        for( int j = 0 ; j < result.length ; j++ ) {
            for( int i = 0 ; i < result[0].length ; i++ ) {
                System.out.printf("%f \t", result[i][j] ) ;
            }
            System.out.printf("\n") ;
        }
    }
}
Bei dem Beispiel müsste ich die Matrix
22 28
49 64
76 100
herausbekommen, aber ich bekomme nur
7 19
10 28
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at Matrix.main(Matrix.java:62)

Naja, es hängt also schon beim Rechnen und beim abbilden in der Konsole. Ich habe auch schon versucht einfach eine Matrix zu potenzieren, das hat perfekt funktioniert.
 
Eine kleine Anmerkung am Rande. In Java ist es generelle Praxis, dass Klassennamen in UpperCamelCase und Variablen-, Parameter- und Methodennamen in lowerCamelCase geschrieben werden. Das macht es für andere leichter zu lesen.
 
Hätte auch linesA nehmen können, mir gehts darum in A der Zeile und in B der Spalte entlang zu laufen.

Eine kleine Anmerkung am Rande. In Java ist es generelle Praxis, dass Klassennamen in UpperCamelCase und Variablen-, Parameter- und Methodennamen in lowerCamelCase geschrieben werden. Das macht es für andere leichter zu lesen.
Ok, werde nächstesmal drauf achten, danke!
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben