# Funktion Matrizenmultiplikation



## wheinz2409 (20. Apr 2011)

Hallo,

habe hier ein kleines prob. In der main Methode sollen zwei Matrizen angelegt werden und diese dann an eine weitere Methode übergeben werden, die dann diese multipliziert. Irgendwie kriege ich bei der Ausgabe nur komische Zeichen und Zahlen. Hoffe es kann jemand einem Java Anfänger helfen.

mfg

```
public class matrizenMultipli {

	/**
	 * Zwei Matrizen multiplizieren
	 */
	
	public static int[][] maMulti (int matrix_a[][], int matrix_b[][]) {
		int matrix_c[][] = new int[10][10];
		for (int i=0; i<10; i++) {
			for (int j=0; j<10; j++) {
				for (int k=0; k<10; k++) {
					matrix_c[i][j] =+ matrix_a[i][k]*matrix_b[k][j];
				}
			}
		}
		return matrix_c;
	}

	public static void main(String[] args) {
		int wert=1;
		System.out.println("Zwei Matrizen Multiplizieren");
		int matrix_a[][] = new int[10][10];
		int matrix_b[][] = new int[10][10];
		
		for (int i=0; i<matrix_a.length; i++) {
			for (int j=0; j<matrix_a.length; j++) {
				matrix_a[j][i] = wert;
				matrix_b[j][i] = wert;
				wert++;
				System.out.print(matrizenMultipli.maMulti(matrix_a, matrix_b));
			}
		System.out.println();
		
		}
	}
}
```


----------



## Andi_CH (20. Apr 2011)

Das was du siehst ist der hash code deiner Matrize.
Wie die ausgegeben werden soll, muss du selbst implementieren.


----------



## Landei (20. Apr 2011)

[c]System.out.println(java.util.Arrays.toString(meinArray));[/c]

Nebenbei sollte man Code möglichst allgemein schreiben. Statt z.B. fest von der Größe 10 auszugehen, sollte man diese lieber von den übergebenen Arrays auslesen (die man sowieso noch auf die richtigen Dimensionen prüfen sollte). Sonst hast du ein Problem, wenn du in einem halben Jahr deinen Code wieder herauskramst und die Funktion für 11x11-Matrizen verwendest.


----------



## SlaterB (20. Apr 2011)

bedenke auch

```
public class Test {
    public static void main(String[] args)  {
       int x = 4;
       int y = 4;
       x =+ 5;
       y += 5;
       System.out.println(x);
       System.out.println(y);
    }
}
```


----------



## wheinz2409 (20. Apr 2011)

Das mit dem hash code verstehe ich nicht ganz? Wenn ich die beiden erstellten Matrizen ausgebe, stehen alle Werte richtig im Array. Nur nach der Multiplikation bekomme ich so komische Werte.
mfg


----------



## Final_Striker (20. Apr 2011)

"komische Werte" ???
Geht es auch etwas genauer?


----------



## SlaterB (20. Apr 2011)

> Wenn ich die beiden erstellten Matrizen ausgebe, 
wo machst du das denn? im Code nicht zu sehen

> Nur nach der Multiplikation bekomme ich so komische Werte.
was für eine Ausgabe denn genau?
siehe auch mein Post zwischendurch, 14:22


----------



## wheinz2409 (20. Apr 2011)

@SlaterB, deinen Beitrag habe ich gesehen und verstanden was da passiert. Habe meinen Code auch schon geändert. Es sollen zwei Matrizen (matrix_a & matrix_b) miteinander multipliziert werden. Nach der Berechnung bekomme ich folgendes als Ausgabe:

[[I@19821f, [I@addbf1, [I@42e816, [I@9304b1, [I@190d11, [I@a90653, [I@de6ced, [I@c17164, [I@1fb8ee3, [I@61de33]
[[I@19821f, [I@addbf1, [I@42e816, [I@9304b1, [I@190d11, [I@a90653, [I@de6ced, [I@c17164, [I@1fb8ee3, [I@61de33]
[[I@19821f, [I@addbf1, [I@42e816, [I@9304b1, [I@190d11, [I@a90653, [I@de6ced, [I@c17164, [I@1fb8ee3, [I@61de33]
[[I@19821f, [I@addbf1, [I@42e816, [I@9304b1, [I@190d11, [I@a90653, [I@de6ced, [I@c17164, [I@1fb8ee3, [I@61de33]
[[I@19821f, [I@addbf1, [I@42e816, [I@9304b1, [I@190d11, [I@a90653, [I@de6ced, [I@c17164, [I@1fb8ee3, [I@61de33]
[[I@19821f, [I@addbf1, [I@42e816, [I@9304b1, [I@190d11, [I@a90653, [I@de6ced, [I@c17164, [I@1fb8ee3, [I@61de33]
[[I@19821f, [I@addbf1, [I@42e816, [I@9304b1, [I@190d11, [I@a90653, [I@de6ced, [I@c17164, [I@1fb8ee3, [I@61de33]
[[I@19821f, [I@addbf1, [I@42e816, [I@9304b1, [I@190d11, [I@a90653, [I@de6ced, [I@c17164, [I@1fb8ee3, [I@61de33]
[[I@19821f, [I@addbf1, [I@42e816, [I@9304b1, [I@190d11, [I@a90653, [I@de6ced, [I@c17164, [I@1fb8ee3, [I@61de33]
[[I@19821f, [I@addbf1, [I@42e816, [I@9304b1, [I@190d11, [I@a90653, [I@de6ced, [I@c17164, [I@1fb8ee3, [I@61de33]


----------



## wheinz2409 (20. Apr 2011)

Kann es vielleicht daran liegen dass ich bei der Ausgabe keinen Index angebe, auf welches Feld ich bei der berechneten Matrize zugreifen möchte?


----------



## SlaterB (20. Apr 2011)

tja, bei zwei Dimensionen versagt auch Arrays.toString(meinArray), nutze altbekannte Schleifen,
schreibe dir am besten eine Untermethode ausgabe(int[][] array), die System.out.println verwendet oder einen String zusammenbaut und zurückgibt,
übe zunächst mit eindimensionalen Arrays, falls es Probleme gibt

du hast noch nicht verraten, was "Wenn ich die beiden erstellten Matrizen ausgebe, stehen alle Werte richtig im Array." bedeutet


----------



## wheinz2409 (20. Apr 2011)

Ich meinte wenn die beiden Matrizen (matrix_a & matrix_b) erstellt und mit Werten gefüllt wurden. Wenn ich diese vor der Multiplikation ausgebe, steht in jedem Feld eine Zahl. Nur wenn ich die Methode maMulti aufrufe und matrix_c mit den multiplizierten Werten fülle, bekomme ich oben gezeigte Ausgabe.


----------



## SlaterB (20. Apr 2011)

> Wenn ich diese vor der Multiplikation ausgebe, 

du weigerst dich weiter, den Code dazu zu nennen, wahrscheinlich nutzt du Schleifen, z.B. jeden Wert einzeln bei der Befüllung, 
fürs Ergebnis verwendest du stattdessen eine andere Art der Ausgabe, anderen Code

du siehst nicht ein, dass es also am Code liegt, nicht an der Wahl der Arrays, ob nun A, B oder Ergebnis?

> Kann es vielleicht daran liegen dass ich bei der Ausgabe keinen Index angebe, auf welches Feld ich bei der berechneten Matrize zugreifen möchte? 

genau, das kann sehr gut sein


----------



## wheinz2409 (20. Apr 2011)

Hier der Code der die Berechnung durchführt und die matrix_c füllt:


```
for (int i=0; i<10; i++) {
			for (int j=0; j<10; j++) {
				for (int k=0; k<10; k++) {
					matrix_c[i][j] += matrix_a[i][k]*matrix_b[k][j];
				}
			}
		}
		return matrix_c;
```

Mittlerweile habe ich einen Index bei der Ausgabe hinzugefügt und bekomme jetzt für jedes Feld eine 0 ausgegeben.


----------



## SlaterB (20. Apr 2011)

ich würde dir jetzt nebenbei vorschlagen für Tests auf eine kleinere Maxtrix von 1x1 oder 2x2 umzustellen,
aber wie Landei schon gesagt hat geht das bei deinem Code nicht so leicht, 
überlege dennoch in der Richtung

außerdem viele System.out.println() einbauen, schaue doch genau nach was für jeden Index an Zahlen multipliziert werden,

bestimmt ist dein Problem aber, dass du während der Befüllung der Arrays schon rechnest, da sind doch die meisten Stellen im Array noch leer, 0,
folgender Test

```
public class Test
{
    public static void main(String[] args)
    {
        matrizenMultipli.main(null);
    }
}


class matrizenMultipli
{
    public static int[][] maMulti(int matrix_a[][], int matrix_b[][])
    {
        int matrix_c[][] = new int[10][10];
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                for (int k = 0; k < 10; k++)
                {
                    matrix_c[i][j] += matrix_a[i][k] * matrix_b[k][j];
                }
            }
        }
        return matrix_c;
    }

    public static void main(String[] args)
    {
        int wert = 1;
        System.out.println("Zwei Matrizen Multiplizieren");
        int matrix_a[][] = new int[10][10];
        int matrix_b[][] = new int[10][10];

        for (int i = 0; i < matrix_a.length; i++)
        {
            for (int j = 0; j < matrix_a.length; j++)
            {
                matrix_a[j][i] = wert;
                matrix_b[j][i] = wert;
                wert++;
            }
        }
        System.out.print(matrizenMultipli.maMulti(matrix_a, matrix_b)[0][0]);
    }
}
```
liefert als Ausgabe (nur eine Stelle des Ergebnisarrays, siehe Code)

```
Zwei Matrizen Multiplizieren
3355
```


----------



## wheinz2409 (20. Apr 2011)

Vielen Dank,

jetzt läufts. Der Fehler lag an der fehlenden Indexangabe bei der Ausgabe von matrix_c.

mfg


----------



## Landei (20. Apr 2011)

SlaterB hat gesagt.:


> tja, bei zwei Dimensionen versagt auch Arrays.toString(meinArray)...



Für tiefer geschachtelte Arrays gibt es [c]Arrays.deepToString(meinArray)[/c].


----------

