# Matrix mit Vektor multiplizieren



## Zipe (10. Nov 2013)

Hey Leute,

Ich weiß es gibt schon ne Menge zu dem Thema im Internet, aber irgendwie werde ich aus vielem nicht schlau. Es geht wie in der Überschrift erwähnt um die Multiplikation einer Matrix mit einem Vektor.


```
public void mul(int [][] matrix, int [] vektor){
			
			int [] newVektor = {0,0,0};
			for(int i = 0; i < matrix.length ; i++){
				for (int j = 0; j < matrix[0].length; j++){
					newVektor[i] += matrix [i][j] * vektor[i];
					System.out.print (newVektor);
				}
					
			}
		}
```


Führe ich die Methode in der main-methode aus, werden mir aber nur die Speicherplätze der Arrays ausgegeben (jedenfalls glaube ich, dass das die Speicherstellen sind). Ist der Code so überhaupt korrekt? Wie kann ich das ganze korrekt ausführen, sodass ich am Ende den Ergebnisvektor kriege?

Mfg


----------



## stg (10. Nov 2013)

Schöner wäre es sicherlich, wenn deine Methode eine Vektor zurückgibt, statt ihn einfach nur zu berechnen und dann wegzuschmeißen.
Die Ausgabe kannst du dann in einer gesonderten Methode, unabhängig von der Berechnung realisieren
Entweder du programmierst deine Lösung für 3x3 Matrizen und 3-dim Vektoren (bzw auch nx3-Matrizen und 3-dim Vektoren), oder du machst es so allgemein wie möglich für nxm-Matrizen und m-dim Vektoren, aber dieses Mischmasch da gefällt mir nicht wirklich.
 Den Inhalt deines Arrays kannst du bequem mit Arrays.toString(·) aus java.util  ausgeben lassen, wenn du keine bestimmte Formatierung des Ausgabe oÄ wünscht. Momentan gibst du wirklich nur die Adresse im Speicher an, an der dein Vektor liegt.


----------



## Zipe (10. Nov 2013)

Danke schonmal!

Habe aus der void-Methode jetzt ne int-Methode gemacht. Allerdings weiß ich nicht genau wie ich den ergebnisvektor ausgebe ... 


```
public int mul(int [][] matrix, int [] vektor){
			
			int [] newVektor;
			for(int i = 0; i < matrix.length ; i++){
				for (int j = 0; j < matrix[0].length; j++){
					newVektor[i] += matrix [i][j] * vektor[i];
					
					return newVektor[];
				}
					
			}
		}
```
funktioniert nicht so ganz ... was schreibe ich in die eckigen klammern?

Also das Ziel ist es Matrizen und Vektoren beliebiger Größe multiplizieren zu können. Allerdings gehe ich davon aus, dass die Dimension des Vektors mit der Höhe der Matrix übereinstimmt. Ich hab die Initialisierung von "newVektor" mal weggenommen, falls du das meintest.

Ich würde die Ausgabe in der main-Methode sonst einfach mit System.out.print (mul(...)) machen ... falls das auch geht.

Sind die Schleifen denn im Allgemeinen richtig?


----------



## stg (10. Nov 2013)

Der Rückgabetyp muss 
	
	
	
	





```
int []
```
 lauten, nicht bloß 
	
	
	
	





```
int
```
. Den "fertigen" Vektor musst du außerhalb der äußeren for-Schleife zurückgeben, sonst bricht deine Methode bereits nach dem ersten Durchlauf  der inneren for-Schleife ab.


----------



## Zipe (10. Nov 2013)

Okay, hab grad bemerkt, dass ich den vektor doch initialisieren muss. 
Wie kann ich den denn allgemeiner initialisieren? Oder was genau meintest du mit Mischmasch?


----------



## Zipe (10. Nov 2013)

Kann mir vielleicht jemand sagen, wo der Fehler bei der Methode liegt ???:L


```
public static int [] mul (int [][] matrix, int [] vektor){
			
			int [] newVektor = {0,0,0};
			for(int i = 0; i < matrix.length ; i++){
				for (int j = 0; j < matrix[0].length; j++){
					newVektor[i] += matrix [i][j] * vektor[i];
					
					
				}
			}
			return newVektor;
		}
```

irgendwas muss falsch sein ... aber ich komme nicht drauf


----------



## DrZoidberg (10. Nov 2013)

Du multiplizierst einen Vektor mit einer Matrix, indem du die 3 Spalten aus denen die Matrix besteht jeweils mit dem x,y und z Wert des Vektors multiplizierst und die drei Ergebnisvektoren dann addierst.

```
(x)   [a d g]       (a)       (d)       (g)
(y) * [b e h] = x * (b) + y * (e) + z * (h)
(z)   [c f i]       (c)       (f)       (i)

  (x*a + y*d + z*g)
= (x*b + y*e + z*h)
  (x*c + y*f + z*i)
```

Ändere vektor_ in Zeile 6 um in vektor[j]. Der Rest sieht richtig aus._


----------



## Zipe (10. Nov 2013)

Super danke!

hab jetzt noch eine Frage ... ich will, dass ich eine beliebige matrix mit einem beliebigen vektor multiplizieren kann.

Dafür muss ich irgendwas an meiner initialisierung von "newVektor" in meiner Methode ändern.
Aber ich versteh nicht was.

Wenn ich zB. 


```
public static int [] mul(int [][] matrix, int [] vektor){
			
			int [] newVektor = {0,0,0,0};
			for(int i = 0; i < matrix.length ; i++){
				for (int j = 0; j < matrix[0].length; j++){
					newVektor[i] += matrix [i][j] * vektor[j];
					
				}
			}
			return newVektor;
		}
```
schreibe und dann eine 4x2 Matrix multipliziere dann funktioniert auch alles einwandfrei.

Wie kann ich den Vektor irgendwie allgemeiner schreiben?!


----------



## DrZoidberg (10. Nov 2013)

```
int [] newVektor = new int[vektor.length];
```


----------



## Zipe (10. Nov 2013)

funktioniert zwar für die 3x3 matrix aber gibt nen exception Fehler für die 4x2 ???:L

Edit: Liegt wahrscheinlich daran, dass ich der Methode nen vektor übergebe der (1,1,1) so aussieht ... okay glaube ich habs dann

Edit 2: Ne liegt doch nicht daran  ich übergebe für die 4x2 nen vektor (-1, 1) ...sollte eigentlich gehen ???:L aber gibt nen fehler


----------



## DrZoidberg (10. Nov 2013)

Wenn du einen Vektor mit einer Matrix multiplizierst, dann muss die Anzahl an Spalten in der Matrix gleich sein zur Anzahl der Elemente im Vektor. Andernfalls macht das ganze mathematisch keinen Sinn.


----------



## Zipe (10. Nov 2013)

Wenn ich aber zB eine Matrix

4   1   2  4
2   1   2  5

habe und einen vektor

1
4

dann müsste das doch machbar sein vom rechnerischen her. Allerdings gibt er mir für sowas nen exception Fehler


----------



## DrZoidberg (10. Nov 2013)

Nein, das ist leider rechnerisch nicht machbar.

Matrix-Vektor-Produkt ? Wikipedia


----------



## Zipe (11. Nov 2013)

ah natürlich  hast Recht

Alles klar danke!


----------

