GSL/BLAS: Multiplikation einer matrix mit einer inversen matrix
Bin ich mit dem GNU GSL zu tun, einige matrix-Berechnungen. Ich bin versucht zu multiplizieren eine matrix B mit der inversen einer matrix A.
Nun habe ich bemerkt, dass die BLAS-Teil GSL hat eine Funktion, um dies zu tun, aber nur, wenn Eine ist dreieckig. Gibt es einen bestimmten Grund dafür? Auch, was wäre der Schnellste Weg, das zu tun diese Berechnung? Sollte ich umkehren Einer mit LU-ZERLEGUNG, oder gibt es eine bessere Möglichkeit?
FWIW, A hat die form P'GP, wo P ist eine normale matrix, P' ist die umgekehrte, und G ist eine Diagonale matrix.
Tausend Dank 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Glaube ich, dass Adrien Recht ist mit der Grund für BLAS nicht mit einem inverse-Funktion für quadratische Matrizen. Es hängt von der matrix, die Sie verwenden, zu optimieren, das Kalkül seiner inversen.
Im Allgemeinen können Sie die LU-ZERLEGUNG, die gilt für jede quadratische matrix. I. e., so etwas wie:
wo ist die quadratische matrix, die Sie wollen Ihre inverse, p ist ein
gsl_permutation
Objekt (die permutation-Objekt, in dem die permutation matrix-codiert ist), signum ist das Vorzeichen der permutation und INVG ist die inverse von A.Da Sie feststellen, dass
A = P' G P
wirdP
normal undG
Diagonale, wahrscheinlichA
ist eine normale matrix. Ich habe Sie nicht genutzt in eine Weile, aber es muss doch eine Faktorisierung theorem für Sie, die Sie hier finden können in der Kapitel 14 der GSL-Referenz-Handbuch oder noch besser, in einem lineare algebra Buch.Nur ein Beispiel, wenn Sie hatte eine symmetrische positiv definite Matrizen und finden wollte, dessen Kehrwert, könnten Sie die Cholesky Faktorisierung, die optimiert ist für diese Art von Matrizen. Dann könnten Sie
gsl_linalg_cholesky_decomp()
undgsl_linalg_cholesky_invert()
Funktionen in der GSL, um es effizient.Ich hoffe, es hilft!
kurz gesagt:
Die Tatsache, dass nur dreieckige Matrizen unterstützt werden ist einfach, weil diese Bedienung ist wirklich einfach durchzuführen, für die eine dreieckige matrix ( seine sogenannten back-substitution) und BLAS nur stellt Routinen für low-level-Funktionen. Jeder höhere level-Funktion ist in der Regel gefunden in LAPACK verwendet BLAS intern für block-Weise Operationen.
In dem speziellen Fall, Sie sind der Umgang mit:
A:=P'*G*P
, wennP
ist eine normale matrix, dann ist die inverse vonA
geschrieben werden könneninv(A) := P'*inv(G)*P
. Sie haben dann zwei Möglichkeiten:inv(A)
und multiplizieren Sie ihn mitB
.inv(A)
: multiplizierenB
durchP
(auf der linken Seite), dann skalieren Sie jede Zeile des Ergebnisses mit der inversen der diagonalen Elemente vonG
und dann multiplizieren erneut mitP'
(wieder Links).Je nach dem speziellen Fall, können Sie wählen Sie Ihre Methode. Trotzdem, müssen Sie
dgemm
(matrix-matrix-Multiplikationen, Lvl3 BLAS) unddscal
(Skalierung der Linien, Lvl 1 BLAS), vorausgesetzt, double precision.Hoffe, das hilft.
A.