# boolesche Matrixmultiplikation



## ignos (1. Dez 2009)

Hi Folgende Teilaufgabe bekomme ich nicht hin!

Multiplizieren sie zwei boolesche Arrays a und b der Dimensionen n×n. Das Ergebnis ist wiederum ein boolesches Array derselben Dimension z.B.

Hier ergibt sich folgendes:
c[1][1] = (a[1][0] ^ b[0][1]) v (a[1][1] ^ b[1][1]) = (false ^ true) v (true ^ true) = false v true = true

Ich habe leider nur Schleife zum durchlaufen und eine neuen booleschen Array erstellt..

```
public static boolean[][] multiVerbindung(boolean[][] verbindung1, boolean[][] verbindung2)
	{
		boolean[][] multiBool= new boolean[verbindung1.length][verbindung1.length];
		
		for(int i=0; i<verbindung1.length; i++)
		{
			for(int j=0; j<verbindung1[i].length; j++)
			{
                            ......
			}
		}
	}
```

tja krieg den Inhalt nicht hin. Vielleicht seid ihr ein wenig behilflich!


----------



## javimka (1. Dez 2009)

Das hier ist eine normale Matrixmultiplikation:

```
public double[][] matmult(double[][] a, double[][] b) {
    int m = a.getColumnDimension(); // das musst du selber implementieren
    int l = a.getRowDimension(); // das musst du selber implementieren
    int n = b.getRowDimension(); // das musst du selber implementieren
    
    double[][] c = new double[n][m];
    
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++) {
        c[i][j] = 0.0;
        for (int k = 0; k < l; k++) {
          c[i][j] += a[i][k] * b[k][j];
        }
      }
    }
    
    return c;
  }
```
Jetzt musst du noch + in v und * in ^ umwandeln


----------



## ignos (1. Dez 2009)

hmm ok....


----------



## javimka (1. Dez 2009)

Weisst du denn, wie die Matrixmultiplikation theoretisch funktioniert? Du hast gesagt, die Matrix sein vond er Grösse nxn, aber was du hier mit 0 und 1 machst, zeugt von einer Matrix der Grösse 2x2.

Um das Element cij zu berechnen brauchst du die i-te Zeile von a und die j-te Spalte von b. Zwei Schleifen brauchst du um alle cij besuchen zu können und pro cij brauchst du eine Schleife, um alle a_[:] und b[:][j] zusammenrechnen zu können. Macht drei Schleifen.

Du hast es ausserdem noch einfach, dass bei dir alle Matrizen nxn gross sind, d.h. dort, wo ich geschrieben habe "das musst du selber implementieren", kannst du überall gleich "n" hinschreiben._


----------



## ignos (1. Dez 2009)

Was meinste dazu?


```
public static boolean[][] multi(boolean[][] a, boolean[][] b)
{
	boolean[][] c= new boolean[a.length][a.length];
		
	for(int i=0; i<a.length; i++)
	{
		for(int j=0; j<a.length; j++)
		{
			for (int k = 0; k<a.length; k++)
			{
				c[i][j] = c[i][j] || (a[i][k] && b[k][j]);

			}
		}
	}
	return c;
}
```


----------



## partsch (1. Dez 2009)

> Was meinste dazu?
> public static boolean[][] multi(boolean[][] a, boolean[][] b)
> {
> boolean[][] c= new boolean[a.length][a.length];
> ...


_

und was ist wenn b weniger reihen oder spalten als a hat? :bahnhof:_


----------



## javimka (1. Dez 2009)

Sieht soweit richtig aus, gut gemacht 
Ob das Resultat stimmt, wirst du mit ein paar Tests ja selber herausfinden. Wahrscheinlich solltst du die && (=AND) noch in ^ (=XOR) ersetzen, so hast du es jedenfalls in deinem ersten Post angegeben.

@partsch
Wenn b weniger als a.length Zeilen hat, ist es eine ungültige Matrixmultiplikation. Ausserdem sind die Matrizen alle von der Grösse nxn, man darf wohl davon ausgehen*, dass die Parameter diese Bedingung erfüllen.

*jaja, explodierende Raketen...


----------



## ignos (1. Dez 2009)

Vielen Dank.
Wobei ich glaube, dass ^(=and), v (=oder) sein soll, da sonst true^true=false ergeben würde!

@partsch
das was javimka sagt


----------



## javimka (1. Dez 2009)

Ich würde mir das sehr gut überlegen, ob ^ wirklich AND bedeuten soll. Denn ^ ist nunmal das Zeichen für XOR und nur weil true^true = false ist, muss das nicht falsch sein.


----------



## ignos (1. Dez 2009)

nein ich meinte sonst müsste es nicht wie oben steht true^true=true ergeben sondern false.


----------

