boolesche Matrixmultiplikation

Status
Nicht offen für weitere Antworten.

ignos

Mitglied
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..
Java:
	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!
 
Zuletzt bearbeitet:

javimka

Top Contributor
Das hier ist eine normale Matrixmultiplikation:
Java:
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 ;)
 
Zuletzt bearbeitet:

javimka

Top Contributor
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

Mitglied
Was meinste dazu?

Java:
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;
}
 
Zuletzt bearbeitet:

partsch

Aktives Mitglied
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=1; j<a.length; j++)
{
for (int k = 0; k<a.length; k++)
{
c[j] = c[j] || (a[k] && b[k][j]);

}
}
}
return c;
}



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

javimka

Top Contributor
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...
 
Zuletzt bearbeitet:

ignos

Mitglied
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

Top Contributor
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.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben