Matrix Vektor Multiplikation

Wenn deine Aufgabenstellung Dimension 4 eh vorschreibt, dann mach doch alles fix in Dimension 4!

also der vector mit einem double[4]
und die matrix mit einem double[4][4]

ist viel einfacher, wenn die Aufgabe nicht mehr verlangt, dann mach nicht mehr…

Wie oben schon von cmrrudolph richtigerweise bemeckert, solltest du im Konstruktor lieber eine Kopie des arrays machen…

return koeffs**, koeffs[j];

ist unmöglich, in Java kann eine Funktion nur ein Argument zurückgeben

(Edit: Wurde schon genannt)

Zugriff auf ein 2-D Array geht so:

return koeffs**[j];```

Du meinst eher koeffs**[j]. So greift man nämlich auf ein zweidimensionales Array zu. In setKoeff hast du es auch richtig gemacht.
Die getDimension-Methode hatte ich nur zur Veranschaulichung gepostet, die brauchst du gar nicht. Für eine Matrix passt das so auch nicht (die haben nämlich gar keine Dimension).

Nur zur Info (für Anfänger):

-was die Java-Leute ein zwei-dimensionales Array nennen, nennen Mathematiker eine Matrix
-was die Java-Leute ein ein-dimensionales Array nennen, nennen Mathematiker einen Vektor

ein mathematischer Vektor besteht aus irgendwelchen Zahlen v_1,…v_n und mathematisch ist dann n die Dimension und dieser Dimensionsbegriff passt gar nicht richtig zur Java-Sprechweise.

Merke: einen Vektor aus einem 4-dimensionalen Vektorraum in Mathe packt man in Java in ein 1-dimensionales Array.

Ist das richtig?:confused:

*** Edit ***

Okay danke, dann muss ich das ja noch multiplizieren, dafür brauche ich doch dann noch einen Ergebnisvektor zB Vektor2 muss ich den dann genauso implementieren oder anders? Hatte das vorher aber das haut ja dann nicht mehr mit dem hin was wir hier bisher gemacht haben oder?

           
       
        for(int i = 0; i < Vektor.length; i++);
        {
            for(int j = 0; j < Vektor2.length; j++);
           
            {
               
               
                Vektor2** += this.Matrix**[j]*this.Vektor[j];
               
           
            }
        }```


(Nicht wundern hab mich jetzt registriert)

[Anmerkung SlaterB: weitere Beiträge zugeordnet]

Naja, bevor du die Multiplikation implementierst, brauchst du erst einmal die Matrix-Klasse. Erstelle doch einmal eine Implementierung dafür.

package mathe;

public class Symmatrix {

private final double[][] koeffs;

public Symmatrix(double[][] init) {
this.koeffs = init;
}


public double getKoeff(int i, int j) {
return koeffs**[j];
}

public void setKoeff(int i, int j, double val) {
koeffs**[j] = val;
}
}```

So? Müsste ja der Vektorimplementierung sehr nahe kommen

Warum heißt die Klasse Symmatrix? Ich sehe dort nirgendwo Code, der irgendwie eine Symmetrie zusichert (was auch ein bisschen aufwändiger ist, denn eine quadratische Matrix ist nicht unbedingt eine symmetrische Matrix).
“Matrix” wäre ein besserer Name. Und im Konstruktor sollte unbedingt geprüft werden, ob das Eingabearray wirklich rechteckig ist (so komisch das auch klingen mag, jeder Eintrag kann eine unterschiedliche “Breite” haben).
Ansonsten sieht das ganz gut aus.

In meinem ersten Post habe ich glaube ich gesagt dass das eine symmetrische Matrix sein soll. Habe das jetzt einfach mal so gemacht wie es beim Vektor ist, für die symmetrische Matrix hatte ich am Anfang dieses Code:

 
public class SymMatrix {
 
public double [][] Matrix = null;
   
public double i , j;    
 
     public SymMatrix(double [][] Matrix) {
         
         for(int j=1; j< Matrix.length + 1; j++){
         for(int i=1; i< Matrix.length + 1; i++){
             
         if (j <= i){
          this.Matrix = new double**[j];
         }
         else{
          Matrix**[j] = Matrix [j]**;
          }
         }
         }
          }
   
    public double get(int zeile, int spalte) {
        return Matrix [zeile][spalte];
    }
   
    public void set(int zeile, int spalte, double wert){
        this.Matrix [zeile][spalte] = wert;
    }```

Da ist jedoch nichts mit koeff, das müsste ich dann ändern, jedoch das mit der Schleife könnte das hinhauen um eine symmetrische Matrix zu implementieren

ob das Array und die Parameter koeffs, Matrix, i, j, zeile oder spalte heißen, dass ist doch alles gleichbedeutend (Großbuchstaben am Anfang aber vermeiden!), nicht klar?

bei Schleifen sollte man immer aufpassen was man damit bezweckt, erklären können, was sie für Code enthalten, was sie machen,

ich sehe da eine Schleife die bei j<=i, einem ziemlich häufigen Fall, ständig ein neues double[][] anlegt, mit den aktuellen i und j,
das kann ja nicht grad sinnvoll sein…

wurde ja auch schon früher um 7:12 als ‘absolut fehlerhaft’ bezeichnet,
was ist dein Erkenntnisgewinn seitdem?

von außen kann man nicht viel mehr sagen als dass das falsch ist, besser weg soll, dich nach dem Sinn fragen,
wenn du daran festhalten willst solltest du dazu vielleicht Sätze schreiben, Details klären

ständig nur Codes von verschiedenen Seiten und ‘So?’-Fragen zu unbekannten Zielen ist wenig effektiv

“ständig nur Codes von verschiedenen Seiten und ‘So?’-Fragen zu unbekannten Zielen ist wenig effektiv”

Ich hab langsam genug davon hier ständig kritisiert zuwerfen Codes von irgendwelchen Seiten zu kopieren und dann zufragen. Lieber mal nichts sagen bevor man was falsches sagt.
Den Code für die symmetrische Matrix egal ob er richtig oder falsch ist habe ich zusammen mit einem Freund eigenhändig in mein Programm eingetippt und dann hier reinkopiert um Fragen zustellen. Nichts mit irgendwo zusammen gesucht im Internet. Auch wenns falsch ist sowas brauch ich mir echt nicht anhören von wegen ich mache nichts selbst

this.Matrix = new double**[j];
macht so wenig Sinn, es sieht so aus, als ob du Die Übergebene Matrix kopieren willst. Dafür müsstest du einmal vor den schlifen dein Array definieren und dann die Werte kopieren :

Matrix = new double[maxI][maxJ];
und nachher dann in der Schleife:
this.Matrix**[j] = Matrix**[j];

Eventuell solltest du dir mal ein paar Beispiele und Erklärungen zu Arrays angucken:
http://openbook.galileocomputing.de/javainsel9/javainsel_03_007.htm

[QUOTE=Puppi]Ich hab langsam genug davon hier ständig kritisiert zuwerfen Codes von irgendwelchen Seiten zu kopieren und dann zufragen. Lieber mal nichts sagen bevor man was falsches sagt.
Den Code für die symmetrische Matrix egal ob er richtig oder falsch ist habe ich zusammen mit einem Freund eigenhändig in mein Programm eingetippt und dann hier reinkopiert um Fragen zustellen. Nichts mit irgendwo zusammen gesucht im Internet. Auch wenns falsch ist sowas brauch ich mir echt nicht anhören von wegen ich mache nichts selbst[/QUOTE]
In #12 bezog ich mich auf dein Posting von @Bleiglanz ’ Code, nicht auf deinen Ausgangspost.
Das entscheidende ist, dass dir noch das Verständnis für das, was du machst, fehlt. Das sieht man an grundlegenden Fehlern, die euer Code enthält:

  • new double**[j] instantiiert jedes mal ein komplett neues Array, dabei verschwinden alle Einträge, die vorher darin waren
  • die Indizes von Arrays beginnen bei 0, nicht bei 1

Diese Defizite musst du aufarbeiten, wir versuchen dir dabei zu helfen, auch wenn das manchmal etwas ruppig rüber kommt.

*** Edit ***

Ach so, soll di e Matrix symmetrisch oder quadratisch sein?

das ich defizite habe weiß ich, informatik ist einfach nicht mein ding, ich muss es aber leider belegen, also sehts mir nach, mach das nicht seit Jahren sondern quasi seit paar wochen. trotzdem finde ich es nicht fair mir zu unterstellen ich kopiere sachen.
aber an alle dir mir helfen geht ein Riesendank!

@cmrudolph beides ^^ es soll eine symmetrische quadratische matrix sein

@cresse das verstehe ich nicht ganz, also bei meiner Matrix ja?
in etwa so?


	public double [][] Matrix = null;
	   
	public double i , j;    
	public double maxI, maxJ;
	
	     public void Matrix(double [][] Matrix) {
	         
	    	 Matrix = new double[(int) maxI][(int) maxJ];
	    	 
	         for(int j=1; j< Matrix.length + 1; j++){
	         for(int i=1; i< Matrix.length + 1; i++){
	             
	         if (j <= i){
	          this.Matrix**[j] = Matrix**[j];
	         }
	         else{
	          Matrix**[j] = Matrix [j]**;
	          }
	         }
	         }
	          }
	   
	    public double get(int zeile, int spalte) {
	        return Matrix [zeile][spalte];
	    }
	   
	    public void set(int zeile, int spalte, double wert){
	        this.Matrix [zeile][spalte] = wert;
	    }```

Ok, die Matrix soll also symmetrisch sein (was voraussetzt, dass die Matrix quadratisch ist, deshalb nannte ich die Bedingungen oben in der Reihenfolge).

Die Matrix-Methode ist kein Konstruktor. Der Konstruktor muss SymMatrix heißen und das void darf dort nicht stehen.
Noch einmal der Hinweis, das Argument des Konstruktors sollte klein geschrieben werden(matrix wäre ein guter Name). Der Typ (double[][]) passt schon.

Soll die Matrix als Dreieck oder komplett übergeben werden?

Die Zeilen- und Spaltenzahl könntest du so ermitteln:

int spalten = matrix[0].length;```

Dort siehst du den Einsatz des length-Attributes eines Arrays.
Wie oben beschrieben, gehen die Indizes von 0 bis length-1.
Also:
```for (int zeilenIndex = 0; zeilenIndex < zeilen; zeilenIndex++) {
    for (int spaltenIndex = 0; spaltenIndex < spalten; spaltenIndex++) {
        matrix[zeilenIndex][spaltenIndex] ...```

*** Edit ***

Im Konstruktor muss dann noch geprüft werden, ob die übergebene Matrix symmetrisch ist bzw. die Werte müssen so kopiert werden, dass sich eine symmetrische Matrix ergibt.

ja es wäre gut, wenn die matrix als dreieck übergeben wird, deshalb hatte ich probiert diese schleifen einzubauen, damit gezeigt wird dass [j]=[j] ist

             for(int i=1; i< Matrix.length + 1; i++){
                 
             if (j <= i){
              this.Matrix**[j] = Matrix**[j];
             }
             else{
              Matrix**[j] = Matrix [j]**;
              }
             }```

Von der Methodik her ist euer Vorgehen gut. Bitte korrigiere die angesprochenen Fehler in deinem Code.

[QUOTE=Puppi]„ständig nur Codes von verschiedenen Seiten und ‚So?‘-Fragen zu unbekannten Zielen ist wenig effektiv“

Ich hab langsam genug davon hier ständig kritisiert zuwerfen Codes von irgendwelchen Seiten zu kopieren und dann zufragen. Lieber mal nichts sagen bevor man was falsches sagt.
Den Code für die symmetrische Matrix egal ob er richtig oder falsch ist habe ich zusammen mit einem Freund eigenhändig in mein Programm eingetippt und dann hier reinkopiert um Fragen zustellen. Nichts mit irgendwo zusammen gesucht im Internet. Auch wenns falsch ist sowas brauch ich mir echt nicht anhören von wegen ich mache nichts selbst[/QUOTE]
‚von verschiedenen Seiten‘ hieß ‚von verschiedenen Parteien‘, von dir eine Variante, von 2-3 Antwortern usw. :wink:
so fehlerhaft (wenn man das kritisieren darf) ist das bestimmt von keiner Webseite zu vermuten

inwiefern es hier im Thread effektiv voran geht ist durchaus auch interessant zu beleuchten,
wie ich schrieb kann man zu deinem Code nicht viel mehr sagen als dass er falsch ist, du musst dir mehr Details überdenken, nicht nur nochmal
‚hier ein neuer Code (egal von wem :wink: ), wie sieht es nun aus?‘

mit this.Matrix**[j] = Matrix**[j]; statt this.Matrix = new double**[j];
ist ja auch durchaus nun ein gewisser Fortschritt erreicht, so klein er aus ist,

ich beschreibe neutral die Tatsachen, nichts persönlich nehmen, bitte :wink:

und: ganz oben hat dir schon jemand geraten, dass in einer Klasse Matrix keine Member-Variable sein soll, die auch Matrix heißt - Member-Variablen schreibt man prinzipiell mit einem Kleinbuchstaben am Anfang. Setz das bitte um, sonst werden wir hier total verwirrt.

den tipp von cresse habe ich geändert, hoffe richtig

	   
	public double i , j;    
	public double maxI, maxJ;
	
	     public void Matrix(double [][] matrix) {
	         
	    	 int zeile = matrix.length;
	    	 int spalte = matrix[0].length;
	    	 
	    	 Matrix = new double[(int) maxI][(int) maxJ];
	    	 
	         for(int j=1; j< Matrix.length + 1; j++){
	         for(int i=1; i< Matrix.length + 1; i++){
	             
	         if (j <= i){
	          this.Matrix**[j] = Matrix**[j];
	         }
	         else{
	          Matrix**[j] = Matrix [j]**;
	          }
	         }
	         }
	          }
	   
	    public double get(int zeile, int spalte) {
	        return Matrix [zeile][spalte];
	    }
	   
	    public void set(int zeile, int spalte, double wert){
	        this.Matrix [zeile][spalte] = wert;
	    }
	
	
}

aber das von dir cmrudolph habe ich nicht ganz verstanden, also das mit den Zeilen und den zeilenindex