transposen Vektor transformieren

minzee

Bekanntes Mitglied
Hi :)

Also ich weiß, wie man einen Vektor mit einer Matrix transformiert, aber wie transformiert man einen transposen Vektor?
Java:
class Vector
{
   public boolean transpose;
   public int[] V;
   /**
    * @param int[] V Vektor (Größe > 0).
    * @param boolean transpose
    */
   public Vector(int[] V, boolean transpose = false)
   {
      this.V = V;
      this.transpose = transpose;
   }
}
class Matrix
{
   public int[][] M;
   /**
    * @param int[][] M Quadratische Matrix (Größe > 0).
    */
   public Matrix(int[][] M)
   {
      this.M = M;
   }
   /**
    * @param Matrix other Dessen M muss gleich groß dieser Instanz sein.
    */
   public Matrix mul(Matrix other)
   {
      int size = M.length;
      int[][] A = new int[size][size];
      for(int i = 0; i < size; ++i) // Zeilen
      {
         for(int j = 0; j < size; ++j) // Spalten
         {
            A[i][j] = 0;
            for(int k = 0; k < size; ++k)
            {
               A[i][j] += M[i][k] * other.M[k][j];
            }
         }
      }
      return new Matrix(A);
   }
   /**
    * @param Vector v Dessen V muss gleich groß dieser Matrix M sein (nur 1-dim.).
    */
   public Vector mul(Vector v)
   {
      int size = M.length;
      int[] a = new int[size];
      if(v.transpose)
      {
          // ????
      }
      else
      {
         for(int i = 0; i < size; ++i) // Zeilen
         {
            a[i] = 0;
            for(int k = 0; k < size; ++k)
            {
               a[i] += A[i][k] * v.V[k];
            }
         }
      }
   }
}
int[][] M = // zeilenweise definiert
{
   {0, 1, 0, 0}, // Zeile 1
   {0, 0, 1, 0}, // Zeile 2
   {0, 0, 0, 1}, // ...
   {0, 0, 0, 0}
};
Matrix m = new Matrix(M);
Wie schaut denn die Formel dafür aus? Die Berechnung ist dann doch anders als für einen normalen Vektor, oder?
 
Zuletzt bearbeitet:

njans

Top Contributor
Erstmal:
transposen gibt es nicht, es heißt transponieren.

Zweitens:
public Vector(int[] V, boolean transpose = false) da müsste dein Compiler schon Alarm schlagen, denn du kannst keinem Parameter im Kopf der Methode/Konstruktors einen Wert zuweisen.

Drittens:
Was willst du machen? Du hast einen Transponierten Vektor und möchtest diesen nun inwiefern transformieren?
 

minzee

Bekanntes Mitglied
Ich bin mir nicht sicher. Vielleicht habe ich die Lösung gefunden:
Java:
class Vector
{
   public boolean transpose;
   public int[] V;
   /**
    * @param int[] V Vektor (Größe > 0).
    */
   public Vector(int[] V)
   {
      this.V = V;
      this.transpose = false;
   }
   /**
    * @param int[] V Vektor (Größe > 0).
    * @param boolean transpose
    */
   public Vector(int[] V, boolean transpose)
   {
      this.V = V;
      this.transpose = transpose;
   }
   public String toString()
   {
      int size = V.length;
      if(transpose)
      {
         String s = "";
         for(int i = 1; i < size; ++i)
         {
            s += ", " + V[i];
         }
         return "{" + V[0] + s + "}";
      }

      String s = "{\n";
      for(int i = 0; i < size - 1; ++i)
      {
         s += "   " + V[i] + ",\n";
      }
      return s + "   " + V[size - 1] + "\n}";
   }
}
class Matrix
{
   public int[][] M;
   /**
    * @param int[][] M Quadratische Matrix (Größe > 0).
    */
   public Matrix(int[][] M)
   {
      this.M = M;
   }
   /**
    * @param Matrix other Dessen M muss gleich groß dieser Instanz sein.
    */
   public Matrix mul(Matrix other)
   {
      int size = M.length;
      int[][] A = new int[size][size];
      for(int i = 0; i < size; ++i) // Zeilen
      {
         for(int j = 0; j < size; ++j) // Spalten
         {
            A[i][j] = 0;
            for(int k = 0; k < size; ++k)
            {
               A[i][j] += M[i][k] * other.M[k][j];
            }
         }
      }
      return new Matrix(A);
   }
   /**
    * @param Vector v Dessen V muss gleich groß dieser Matrix M sein (nur 1-dim.).
    */
   public Vector mul(Vector v)
   {
      int size = M.length;
      int[] a = new int[size];
      if(v.transpose)
      {
         for(int j = 0; j < size; ++j) // Spalten
         {
            a[j] = 0;
            for(int k = 0; k < size; ++k)
            {
               a[j] += v.V[k] * M[k][j];
            }
         }
      }
      else
      {
         for(int i = 0; i < size; ++i) // Zeilen
         {
            a[i] = 0;
            for(int k = 0; k < size; ++k)
            {
               a[i] += M[i][k] * v.V[k];
            }
         }
      }
      return new Vector(a, v.transpose);
   }
   public String toString()
   {
      int size = M.length;
      String s = "{\n";
      
      // alle Zeilen bis auf die letzte:
      for(int i = 0; i < size - 1; ++i) // Zeilen
      {
         s += "   {";
         for(int j = 0; j < size - 1; ++j) // Spalten
         {
            s += M[i][j] + ", ";
         }
         s += M[i][size - 1] + "},\n";
      }
      
      // letzte Zeile:
      s += "   {";
      for(int j = 0; j < size - 1; ++j) // Spalten
      {
         s += M[size - 1][j] + ", ";
      }
      s += M[size - 1][size - 1] + "}\n";
      
      return s + "}";
   }
}
class Main
{
   public static void main(String[] args)
   {      
      int[] V = {10, 20, 30};
      int[][] M = // Daten für Matrix (zeileweise definiert)
      {
         {0, 1, 0}, // Zeile 1
         {0, 0, 1}, // Zeile 2
         {0, 0, 0} // ...
      };
      
      Matrix m = new Matrix(M);
      System.out.println(m);
      
      // normal:
      Vector v1 = new Vector(V);
      System.out.println(v1);
      Vector w1 = m.mul(v1);
      System.out.println(w1);
      
      // transponiert:
      Vector v0 = new Vector(V, true);
      System.out.println(v0);
      Vector w0 = m.mul(v0);
      System.out.println(w0);
   }
}
In den Zeilen 82 bis 89 steht die Transformation für transponierte Vektoren.

Die Ausgabe würde folgendermaßen aussehen:
Code:
{
   {0, 1, 0},
   {0, 0, 1},
   {0, 0, 0}
}
{
   10,
   20,
   30
}
{
   20,
   30,
   0
}
{10, 20, 30}
{0, 10, 20}
Stimmt das?
 
Zuletzt bearbeitet:

JavaMeister

Gesperrter Benutzer
Achsooooooo.

Ja dann ist das richtig. Vorher sieht die Matrix anderes aus als vorher. Also scheint die Transformation gut gelaufen zu sein.
 

stg

Top Contributor
Da stimmen doch die Dimension überhaupt nicht. Wie soll das gehen?
Du solltest vielleicht mal beschreiben, was du genau vor hast. Anhand deines Codes erraten, mag ich das nun nicht wirklich...
 

minzee

Bekanntes Mitglied
Was ich eigentlich machen will, ist nicht ganz leicht zu erklären. Aber ich versuchs mal. Ein Kollege und ich versuchen einen Algorithmus zu optimieren. Und zwar geht es um einen Genetischen Algorithmus.

Gegeben sind ein paar elektronische Geräte, die in einem Netzwerk miteinander verbunden werden sollen. Das Netzwerk soll eine Baumstruktur ergeben, die Geräte sind die Knoten. Die Baumstruktur wird in einer Adjazenzmatrix definiert.

Eine Population besteht aus einer gewissen Anzahl von unterschiedlichen Adjazenzmatrizen. Die werden gekreuzt und mutiert. Nach jeder Mutation hat man eine neue Adjazenzmatrix. Und hier soll nun kontrolliert werden, ob noch alle Knoten eine Verbindung zu einem bestimmten Startknoten haben.

Uns liegt ein Pseudocode vor, in dem hierzu die Adjazenmatrix A potenziert und addiert wird. Und das n - 1 mal, wobei n für die Anzahl der Knoten steht. Die Formel ist also: A(neu) = Summe(von k = 1 bis n - 1) von A^k

Meiner Meinung nach ist es aber nicht nötig, immer Matrizen zu multiplizieren. Meiner Meinung nach reicht es, aus der Matrix einen transponierten Vektor zu extrahieren und diesen mit einer verkleinerten Matrix immer wieder zu multiplizieren und die Vektoren zu addieren.

Bei einer Matrix M von n Elementen in Höhe und Breite (ab 1 durchnummeriert) ergibt sich der transponierte Vektor aus V(t) = {M(1, 2), M(1, 3), M(1, 4), ... M(1, n)}. V(t) ist also die erste Zeile der Matrix ohne dem ersten Element.

Bei der Matrix M verwirft man dann noch die erste Spalte und die erste Zeile.

Man muss dann also nur noch n - 1 mal das folgende tun:
V(t) = V(t) + V(t) * M

In Java schaut das folgendermaßen aktuell bei mir aus:
Java:
class Vector
{
   public boolean transpose;
   public int[] V;
   /**
    * @param int[] V Vektor (Größe > 0).
    */
   public Vector(int[] V)
   {
      this.V = V;
      this.transpose = false;
   }
   /**
    * @param int[] V Vektor (Größe > 0).
    * @param boolean transpose
    */
   public Vector(int[] V, boolean transpose)
   {
      this.V = V;
      this.transpose = transpose;
   }
   /**
    * Gibt ein Teilstück des Vektors zurück.
    * @param int from >= 0
    * @param int to Vektorlänge > to >= from
    * @return Vector
    */
   public Vector slice(int from, int to)
   {
      int[] a = new int[to - from + 1];
      System.out.println(a.length);
      System.out.println(from);
      System.out.println(to);
      for
      (
         int i = 0, j = from; 
         j <= to; 
      )
      {
         a[i++] = V[j++];
      }
      return new Vector(a, transpose);
   }
   /**
    * @param Vector other 
    *    Dessen V muss gleich groß dieser Instanz sein.
    *    Entweder müssen beide transpose oder beide nicht transpose sein.
    * @return Vector
    */
   public Vector add(Vector other)
   {
      int size = V.length;
      int[] a = new int[size];
      for(int i = 0; i < size; ++i)
      {
         a[i] = V[i] + other.V[i];
      }
      return new Vector(a, transpose);
   }
   /**
    * @return String
    */
   public String toString()
   {
      int size = V.length;
      if(transpose)
      {
         String s = "";
         for(int i = 1; i < size; ++i)
         {
            s += ", " + V[i];
         }
         return "{" + V[0] + s + "}";
      }

      String s = "{\n";
      for(int i = 0; i < size - 1; ++i)
      {
         s += "   " + V[i] + ",\n";
      }
      return s + "   " + V[size - 1] + "\n}";
   }
}
class Matrix
{
   public int[][] M;
   /**
    * @param int[][] M Quadratische Matrix (Größe > 0).
    */
   public Matrix(int[][] M)
   {
      this.M = M;
   }
   /**
    * Gibt ein quadratisches Teilstück der Matrix zurück.
    * @param int from >= 0
    * @param int to Matrixgröße > to >= from
    * @return Matrix
    */
   public Matrix slice(int from, int to)
   {
      int length = to - from + 1;
      int[][] a = new int[length][length];
      for
      (
         int i = 0, j = from; 
         j <= to; 
         ++i, ++j
      )
      {
         for
         (
            int k = 0, l = from; 
            l <= to; 
         )
         {
            a[i][k++] = M[j][l++];
         }
      }
      return new Matrix(a);
   }
   public Matrix add(Matrix other)
   {
      int size = M.length;
      int[][] A = new int[size][size];
      for(int i = 0; i < size; ++i) // Zeilen
      {
         for(int j = 0; j < size; ++j) // Spalten
         {
            A[i][j] = M[i][j] + other.M[i][j];
         }
      }
      return new Matrix(A);
   }
   /**
    * @param Matrix other Dessen M muss gleich groß dieser Instanz sein.
    * @return Matrix
    */
   public Matrix mul(Matrix other)
   {
      int size = M.length;
      int[][] A = new int[size][size];
      for(int i = 0; i < size; ++i) // Zeilen
      {
         for(int j = 0; j < size; ++j) // Spalten
         {
            A[i][j] = 0;
            for(int k = 0; k < size; ++k)
            {
               A[i][j] += M[i][k] * other.M[k][j];
            }
         }
      }
      return new Matrix(A);
   }
   /**
    * @param Vector v Dessen V muss gleich groß dieser Matrix M sein (nur 1-dim.).
    * @return Vector
    */
   public Vector mul(Vector v)
   {
      int size = M.length;
      int[] a = new int[size];
      if(v.transpose)
      {
         for(int j = 0; j < size; ++j) // Spalten
         {
            a[j] = 0;
            for(int k = 0; k < size; ++k)
            {
               a[j] += v.V[k] * M[k][j];
            }
         }
      }
      else
      {
         for(int i = 0; i < size; ++i) // Zeilen
         {
            a[i] = 0;
            for(int k = 0; k < size; ++k)
            {
               a[i] += M[i][k] * v.V[k];
            }
         }
      }
      return new Vector(a, v.transpose);
   }
   /**
    * @return String
    */
   public String toString()
   {
      int size = M.length;
      String s = "{\n";
      
      // alle Zeilen bis auf die letzte:
      for(int i = 0; i < size - 1; ++i) // Zeilen
      {
         s += "   {";
         for(int j = 0; j < size - 1; ++j) // Spalten
         {
            s += M[i][j] + ", ";
         }
         s += M[i][size - 1] + "},\n";
      }
      
      // letzte Zeile:
      s += "   {";
      for(int j = 0; j < size - 1; ++j) // Spalten
      {
         s += M[size - 1][j] + ", ";
      }
      s += M[size - 1][size - 1] + "}\n";
      
      return s + "}";
   }
}
class Main
{
   /**
    * Kontrolle, ob alle Knoten vom Startknoten (erster Knoten) direkt oder indirekt erreichbar sind.
    * @param Matrix m Adjazenzmatrix (welche Knoten von welchen anderen Knoten eingehende Kanten haben)
    * @return boolean
    */
   private static boolean allNodesReachable(Matrix m)
   {
      // Alle Knoten erreichbar, wenn es nur max. 1 Knoten gibt:
      int end = m.M.length - 1;
      if(end < 1)
      {
         return true;
      }
      
      // Erste Matrix-Zeile als transponierten Vector (exkl. erstes Element):
      Vector v = new Vector(m.M[0], true).slice(1, end); 
      
      // Matrix ohne erste Spalte und erste Zeile:
      m = m.slice(1, end);
      
      // n - 1 Durchläufe:
      Vector mulV;
      for(int i = 1; i < end; ++i) // ist das korrekt, dass hier ab 1 begonnen werden darf????????????
      {
         mulV = m.mul(v);
         v = v.add(mulV);
         System.out.println("mulV: " + mulV);
         System.out.println("v   : " + v);
      }
      
      // Kontrolle ob alle Vektorelement 1 sind:
      for(int i = 0; i < end; ++i)
      {
         if(v.V[i] == 0)
         {
            return false;
         }
      }
      return true;
   }
   public static void main(String[] args)
   {     
      int[][] x = // 0 -> 1 -> 3 -> 2
      {
         {0, 1, 0, 0},
         {0, 0, 0, 1},
         {0, 0, 0, 0},
         {0, 0, 1, 0}
      };
      
      Matrix m = new Matrix(x);
      System.out.println(allNodesReachable(m) ? "ok" : "nok");
      
      // Zum Vergleich mit Matrix-Potenzen:
      Matrix m0 = new Matrix(x);
      Matrix mulM;
      for(int i = 0; i < 4; ++i)
      {
         mulM = m0.mul(m0);
         m0 = m0.add(mulM);
      }
      System.out.println(m0);
   }
}
Das einzig interessante steckt in der Klasse Main. Aber ich glaube, das schaut ganz gut aus so wie es ist.

Wo ich jetzt noch unsicher bin ist die Zeile 242. Ich versuche irgendwie herauszufinden, ob es reicht, die Schleife nur n - 2 mal durchlaufen zu lassen.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Vektor vs List Java Basics - Anfänger-Themen 4
L Klassen Vektor Klasse Java Basics - Anfänger-Themen 2
E Variable (Vektor) in andere Methode übergeben Java Basics - Anfänger-Themen 4
O Matrix, Vektor Java Basics - Anfänger-Themen 9
J Compiler-Fehler Fehler bei Vektor (E extends Object declared in class Vector) Java Basics - Anfänger-Themen 9
U Ist diese Methode zur Matrix Vektor Multiplikation korrekt ? Java Basics - Anfänger-Themen 5
S Variablen Vektor zur Berechnung verwenden Java Basics - Anfänger-Themen 4
E Matrix mit Vektor multiplizieren Java Basics - Anfänger-Themen 7
M Vektor Rechnung Java Basics - Anfänger-Themen 6
B Stützstellen (Vektor) erzeugen? Java Basics - Anfänger-Themen 8
R Matrix-Vektor-Multiplikation Java Basics - Anfänger-Themen 13
B Vektor addieren Java Basics - Anfänger-Themen 4
F Funktion eines JButton in einen Vektor verlagern Java Basics - Anfänger-Themen 4
Z Matrix mit Vektor multiplizieren Java Basics - Anfänger-Themen 13
P Vektor im R3 drehen? Java Basics - Anfänger-Themen 14
M Map mit Vektor: Element hinzufügen Java Basics - Anfänger-Themen 21
A vektor bearbeiten?? Java Basics - Anfänger-Themen 9
V Position in einem Vektor Java Basics - Anfänger-Themen 3
N Vektor mit eigener Datenstruktur sortieren Java Basics - Anfänger-Themen 20
A Wie greif ich auf Elemente eines Arrays in einem Vektor zu? Java Basics - Anfänger-Themen 6
D Array? ArrayList? Vektor? ...? Java Basics - Anfänger-Themen 6
C OOP Aus Vektor zufällig einen Eintrag wählen und in Array[][] schreiben Java Basics - Anfänger-Themen 5
Z Summe von Vektor-Elementen Java Basics - Anfänger-Themen 5
S Variable über den Vektor bestimmen Java Basics - Anfänger-Themen 20
J klasse vektor addition Java Basics - Anfänger-Themen 10
M Vektor Klasse Problem Java Basics - Anfänger-Themen 12
M Reihenfolge von Objekten im Vektor Java Basics - Anfänger-Themen 3
G Vektor auslesen und als int Variable casten Java Basics - Anfänger-Themen 4
G Mothoden von Objekten in Vektor aufrufen Java Basics - Anfänger-Themen 4
F ComboBox im Vektor auslesen, Vektor<JComboBox> Java Basics - Anfänger-Themen 6
G Probleme mit Datenstrukturen (Vektor, HashMap) Java Basics - Anfänger-Themen 5
T Koordinaten eines Vektor übergeben Java Basics - Anfänger-Themen 21
J Vektor in Vektor speichern? Java Basics - Anfänger-Themen 10
J Vektor null setzen Java Basics - Anfänger-Themen 10
R Vektor in verketteter Liste Java Basics - Anfänger-Themen 14
J Vektor + auf Elemente zugreifen funktioniert nicht Java Basics - Anfänger-Themen 11
H Vektor auslesen und durchsuchen Java Basics - Anfänger-Themen 4
G Vektor Java Basics - Anfänger-Themen 1
C "null" Element Vektor abfragen Java Basics - Anfänger-Themen 7
C vektor erschaffen Java Basics - Anfänger-Themen 2
C Ein Element aus Mehrdimensionalem Vektor lesen Java Basics - Anfänger-Themen 2
L Vektor befüllen? Java Basics - Anfänger-Themen 3
G Doppelte (Paar) Werte in einem Vektor finden Java Basics - Anfänger-Themen 6
S kartesischer Vektor im n-dimensionalen Raum. Java Basics - Anfänger-Themen 7
G Objekte in einen Vektor speichern Java Basics - Anfänger-Themen 4
M Vektor, gefüllt mit Objekten einer selbstdefinierten Klasse Java Basics - Anfänger-Themen 4
C checken ob ein Vektor leer ist Java Basics - Anfänger-Themen 3
J tast-Eingabe_(Vektor)Skalar-produkt Java Basics - Anfänger-Themen 19
G elemente in einem vektor nach ihren eigenschaften sortieren Java Basics - Anfänger-Themen 2
G Problem clone und Vektor Java Basics - Anfänger-Themen 4
M Vektor sortieren Java Basics - Anfänger-Themen 7
P Vektor toString? Java Basics - Anfänger-Themen 2
T Hashtable und Vektor Java Basics - Anfänger-Themen 3
I einlaggern von Objekten in ein Vektor Java Basics - Anfänger-Themen 10
G Vektor Java Basics - Anfänger-Themen 3
T Methoden BinaryTree transformieren Aufgabe Java Basics - Anfänger-Themen 36
A Koordinaten transformieren (Rotation) Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben