Gleichungsystem mit Matrizen lösen

Eddi0406

Ensign
Registriert
März 2006
Beiträge
234
Hallo liebe Forengemeinde,

ich implementiere gerade eine Art Farbkorrektur und bin mir bei einer Gleichungslösung nicht wirklich sicher (keine Hausaufgabe!). Konkret geht es um folgendes:

Code:
W = [A1;B1;C1]
X = [X11,X12,X13;X21,X22,X23;X31,X32,X33]
K = [K1,0,0;0,K2,0;0,0;K3]
P = [A2;B2;C2]
H = [A3;B3;C3]

W = X * K * P + H

Bestimmen möchte ich die Faktoren K1, K2 und K3. Alles andere ist gegeben bzw. bereits bestimmt wurden.

Mein Ansatz ist der folgende:
Code:
W - H = X * K * P
(W - H) * inv(A * P) = K

Im Schritt 2 bin ich mir nicht wirklich sicher. Kennst sich jemand von euch noch damit aus?

Viele Grüße
Eddi0406
 
Zuletzt bearbeitet:
Also, im 2ten Schritt würde es bei mir so aussehen:

inv(X) * (W - H) * inv(P) = K

X und P nimmt man ja durch die Multiplikation von Links bzw Rechts mit deren Inversen raus, oder nicht ?

Übernehme keine Garantie :)
 
Stimmt, die inverse von X muss an die linke Seite. Aber wie bildet man die Inverse einer Spaltenmatrix?!
 
Das rechts Draufmultiplizieren von inv(P) geht afaik nicht, denn die Dimensionen bei der Matrizenmultiplikation stimmen ja dann absolut nicht mehr; ausserdem kann man nur quadratische Matrizen invertieren. Würde es ersteinmal so umformen:
KVektor = (K1, K2, K3)^T
inv(X) * (W - H) = KVektor * P
wobei gilt
KVektor * P = (K1*P1, K2*P2, K3*P3)^T
Dann würde ich weiter umformen:
(1 / P) * inv(X) * (W - H) = KVektor
wobei gilt
1 / P = (1/P1, 1/P2, 1/P3)^T
 
Zuletzt bearbeitet:
Muss ich die zwei Vektoren auf der linken Seite vom Gleichheitszeichen dann über das Kreuzprodukt zusammenführen oder kann ich einfach zeilenweise multiplizieren? Beim Kreuzprodukt wäre die Reihenfolge ja wichtig, sofern ich mich erinnere.
 
Ist wieder die komponentenweise Multiplikation; also insgesamt musst du folgende Schritte ausführen:
1: TempA = (W - H)
2: TempB = inv(X) * TempA
3: KVektor = 1/P * TempB = (TempB1 /P1 , TempB2/P2, TempB3/P3)^T
 
Zuletzt bearbeitet:
Statt mit dem von Nai angegeben Vektor (1/P) würde ich lieber von links mit der folgenden Matrix multiplizieren:
Code:
|1/p1   0    0 |
|  0  1/p2   0 |
|  0    0  1/p3|
Ansonsten bekommt man Probleme mit der Stelligkeit, wie du ja selbst schon gemerkt hast (weiß nicht ob man das durch Kreuzprodukte auflösen kann, aber mir ist das nicht ganz geheuer). Ansonsten würde ich mit der Lösung mitgehen.

Edit: @Nai Der 3. Schritt funktioniert so aber nicht, da bei der Multiplikation von zwei dreistelligen Vektoren entweder eine Zahl oder eine 3x3 Matrix herauskommt (je nachdem in welcher Reihenfolge).
 
Zuletzt bearbeitet:
Okay, habe es jetzt so implementiert und es funktioniert auch.

Danke für eure Hilfe:)
 
Ansonsten bekommt man Probleme mit der Stelligkeit, wie du ja selbst schon gemerkt hast (weiß nicht ob man das durch Kreuzprodukte auflösen kann, aber mir ist das nicht ganz geheuer). Ansonsten würde ich mit der Lösung mitgehen.

Edit: @Nai Der 3. Schritt funktioniert so aber nicht, da bei der Multiplikation von zwei dreistelligen Vektoren entweder eine Zahl oder eine 3x3 Matrix herauskommt (je nachdem in welcher Reihenfolge).

Es kommt darauf an, wie man sich die "*"-Verknüpfung zwischen zwei Vektoren definiert. In der Mathematik und in der Physik ist die Verknüpfung durch "*" zwischen zwei Vektoren meist als Skalarprodukt definiert, da man das am häufigsten braucht. Allerdings verwendet man gerade in der Computergraphik und im GPGPU-Bereich (CUDA, OpenGL, OpenCL, DirectX) oft die "*"-Verknüpfung als komponentenweise Multiplikation:
VektorA = VektorB*VektorC = (VektorB1*VektorC1, . . . . ., VektorBn * VektorCn)^T
Die Ursache dafür ist, dass man bei GPGPU oder in der Computergraphik oft einen Vektor entlang jeder Achse mit einem unterschiedlichen Faktor skalieren will (zB. bei einem rgb Vektor um den blauen Farbkanal des Bildes hervorzuheben und die anderen Farbkanäle zu dämpfen, um die Transparenz von Wasser zu simulieren). Dies kann man entweder per Multiplikation zwischen Diagonalmatrix und Vektor erreichen, oder per komponentenweiser Multiplikation zwischen zwei Vektoren. Da man die Skalierungsfaktoren meist ebenfalls als Vektor vorliegen hat und die Operation sehr häufig braucht, verwendet man eben diese komponentenweise Multiplikation als Definition für die "*"-Verknüpfung.
 
Zuletzt bearbeitet:
Zurück
Oben