Lösen eines linearen Systems mit Matrixargumenten

10

Wir alle kennen die vielen Berechnungsmethoden zur Lösung des linearen Standardsystems

Ax=b.
Ich bin jedoch gespannt, ob es "Standard" -Berechnungsmethoden zum Lösen eines allgemeineren (endlichdimensionalen) linearen Systems der Form gibt

wobei beispielsweise A eine m 1 × n 1 -Matrix ist, B eine m 2 × n 2 -Matrix ist und L ein linearer Operator ist, der m 1 × n 1 -Matrizen zu m 2 × n 2 -Matrizen nimmt, wasbeinhaltet nicht die Matrizen Vektorisierung, dh alleswas auf die Standard Umwandlung A x = b Form.

LA=B,
Am1×n1Bm2×n2Lm1×n1m2×n2Ax=b

Der Grund, den ich frage, ist, dass ich die folgende Gleichung für lösen muss :u

wobei R die 2d-Radon-Transformation ist, R sein Adjunkt ist und sowohl u als auch f 2d-Arrays (Bilder) sind. Es ist möglich, diese Gleichung zu vektorisieren, aber es ist ein Schmerz, besonders wenn wir zu 3D gehen.

(RR+λI)u=f
RRuf

Allgemeiner gesagt , was ist - Arrays? Zum Beispiel L A = B lösen, wobei A und B 3D-Arrays sind (irgendwann muss ich dies auch mit der Radon-Transformation tun).nDLA=BAB

Vielen Dank im Voraus und zögern Sie nicht, mich zu einem anderen StackExchange zu schicken, wenn Sie das Bedürfnis haben.

icurays1
quelle
1
Möglicherweise können Sie einen effektiven mehrstufigen Vorkonditionierer erstellen und dann den konjugierten Gradienten verwenden. Ich habe ein ähnliches Problem, bei dem dies sehr effektiv und sehr parallelisierbar ist. Wenn Sie direkte Methoden wünschen, ziehen Sie Reduzierungen der Schur-Form in Betracht, wie in diesem Artikel
Nick Alger
Ausgezeichnet, danke für den Schiedsrichter! Ich habe CG gerade dazu gebracht, effektiv zu arbeiten, also bin ich glücklich.
icurays1

Antworten:

9

Rny,xRe(yHx)

Eine Sache, auf die Sie bei der Implementierung von CG (oder ähnlichen iterativen Ansätzen) mit allgemeinen linearen Operatoren achten müssen, ist die ordnungsgemäße Implementierung des Adjunkts Ihres linearen Operators. Das heißt, Menschen bekommen oft richtig, machen aber einen Fehler bei der Implementierung von .y=F(x)z=F(y)

Ich empfehle, einen einfachen Test zu implementieren, der die folgende Identität nutzt: für jedes konforme und gilt Sie generieren also zufällige Werte für und , führen sie durch Ihre Vorwärts- und Nebenoperationen und berechnen die beiden obigen inneren Produkte. Stellen Sie sicher, dass sie mit angemessener Genauigkeit übereinstimmen, und wiederholen Sie dies einige Male.xy

y,F(x)=F(y),x.
xy

EDIT: Was machst du, wenn dein linearer Operator symmetrisch sein soll? Nun, Sie müssen auch diese Symmetrie überprüfen. Verwenden Sie also denselben Test und beachten Sie nur, dass --- dieselbe Operation auf und anwendet . Natürlich hat das OP sowohl einen asymmetrischen als auch einen symmetrischen Operator ...F=Fxy

Michael Grant
quelle
Danke @ChristianClason! Ich weiß aus Erfahrung, wie frustrierend Fehler in adjungierten Berechnungen sein können. :) Aus linop_test.mdiesem Grund haben wir in unserem Paket TFOCS eine Routine implementiert . Dieses Paket unterstützt auch Matrizen, Arrays und kartesische Produkte in Vektorräumen.
Michael Grant
3

Wie sich herausstellt, kann der konjugierte Gradient angepasst werden, um diese Art von Gleichung iterativ zu lösen , da mein System symmetrisch und positiv definit ist (da mein linearer Operator als ) . Die einzige Änderung tritt bei der Berechnung innerer Produkte auf - dh eine typische Berechnung innerer Produkte in CG sieht aus wie oder . In der modifizierten Version verwenden wir das Frobenius-Innenprodukt, das durch Summieren der Einträge des Hadamard-Produkts (punktweise) berechnet werden kann. DhRR+λIrkTrkpkTApk

A,B=i,jAijBij

Ich vermute, dass dies beim Upgrade auf 3D-Arrays einwandfrei funktioniert, obwohl ich das auf 3D-Arrays definierte innere Frobenius-Produkt noch nicht gesehen habe (ich gehe davon aus, dass ich das punktweise Produkt wieder summieren kann).

Ich würde mich immer noch für allgemeinere Methoden interessieren, wenn jemand welche kennt!

icurays1
quelle