Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
die Aufgabenstellung lautet, zwei Matritzen miteinander zu multiplizieren. Das Prog. läuft zwar, aber ich bekomme falsche Werte.
"Implementieren Sie die Methode Mult(M): Liefert das Produkt aus der Matrix und M"
Ich habe ein Klasse Matrix die folgendermaßen aussieht
Code:
public class Matrix {
int n, m;
int mtx[][]= new int[n][m];
//Konstruktor
public Matrix(int n, int m) {
this.n = n;
this.m = m;
this.mtx = new int [n][m];
}
//Hier werden falsche Werte berechnet
public void Mult(Matrix m1){
int i,j,y;
int erg=0;
for(i =0; i<n; i++){
if(n != m1.m){ //Abbruchbedingung falls die Matritzen nich multiplizierbar sind
System.out.println("Fehler");
break;
}
for(j=0; j<m1.m; j++){
for(y=0; y<m1.n; y++){
erg = erg+ mtx[i][y]*m1.mtx[y][j];
}
mtx[i][j]=erg;
erg=0;
}
}
}
Ach verdammt, ich hab das Hilfsarray zum Zwischenspeichern der Daten vergessen.
Mit dem Code klappts:
Code:
public void Mult(Matrix m1) {
int i, j, y;
int erg = 0;
int[][] hilfe = new int[n][m];
for (i = 0; i < n; i++) {
if (n != m1.m) {
System.out.println("Fehler");
break;
}
for (j = 0; j < m1.m; j++) {
for (y = 0; y < m1.n; y++) {
erg = erg + mtx[i][y] * m1.mtx[y][j];
}
hilfe[i][j] = erg;
erg = 0;
}
}
for (int a = 0; a < n; a++) {
for (int b = 0; b < m; b++) {
mtx[a][b] = hilfe[a][b];
}
}
}
Das klappt höchstens, wenn beide Matrizen die selbe Grösse haben. Andernfalls kommt da immer noch ein falsches Ergebnis raus.
Wenn z.B. die erste Matrix 3*3 ist und die zweite 1*3, dann müsste das Ergebnis auch 1*3 sein. Ist bei dir aber nicht der Fall.
Ich hab den Code mal etwas verändert. So sollte es gehen.
Java:
public void Mult(Matrix m1) {
if(n != m1.m) {
System.out.println("Fehler");
return;
}
int[][] newMtx = new int[m1.n][m];
//i ist die Spalte in m1 und damit auch die Spalte in newMtx
for(int i = 0; i < m1.n; i++) {
//j ist die Spalte in mtx und gleichzeitig die Zeile in m1
for(int j = 0; j < m; j++) {
//k ist die Zeile in mtx and damit auch die Zeile in newMtx
for(int k = 0; k < m; k++) {
newMtx[i][k] += mtx[j][k] * m1.mtx[i][j];
}
}
}
mtx = newMtx;
n = m1.n;
}
Was ist bei dir die erste und die zweite Matrix ? Allgemein gilt:
man kann nur Matrizen multiplizieren deren Dimensionen m*n und n*k ist wobei das Ergebnis dann eine m*k - Matrix ist. als könnte man im obigen Beispiel nur eine 1*3 mit einer 3*3 Matrix multiplizieren und das Ergebnis ist eine 1*3 - Matrix. Ich denke so hattest du es gemeint.
Mein Verständnis der Aufgabe ist auch so, dass die Funktion nicht die Matrix verändern soll, auf der es aufgerufen wird sondern das Ergebnis soll zurück gegeben werden. ("Implementieren Sie die Methode Mult(M): Liefert das Produkt aus der Matrix und M" - liefert in der Bedeutung von gibt zurück).
Sprich bei Matrix e = m.mult(k); bleibt die Matrix m unverändert und es wird halt eine neue Matrix zurück gegeben.
Dann gebe es schon 3 Matrizen-Objekte, um nur eine Multiplikation durchzuführen. this, m1 und mNew. Außerdem lässt es sich dann nicht mehr so gut lesen. BigInteger gibt einfach this zurück.
Wenn die Aufgabenstellung manchmal unklar ist, hilft es, nachzufragen!
Hängt auch alles davon ab was er miteinander multiplizieren will. Im allgemeinen Fall braucht er auf jeden Fall drei Matrizen da die Ergebnismatrix ja andere Dimensionen hat als die beiden anderen !
Mein Verständnis der Aufgabe ist auch so, dass die Funktion nicht die Matrix verändern soll, auf der es aufgerufen wird sondern das Ergebnis soll zurück gegeben werden
Ich stimme hier kneitzel zu, weil das Ändern des ersten Objekts zu unerwarteten Effekten führen würde.
Code:
BigInteger b1 = new BigInteger("20");
BigInteger b2 = new BigInteger("8");
BigInteger b3 = b1.subtract(b1.subtract(b2));
Hier geht man davon aus, dass der Ausdruck von innen nach außen ausgewertet wird. Wäre die Klasse BigInteger nicht immutable, würde das Ergebnis 0 statt wie erwartet 8 lauten.
Daher sollte bei solch mathematischen Klassen das eigentliche Objekt nicht verändert werden. Ist in Java leider nicht wirklich gut unterstützt.