Lösung linearer Gleichungssysteme mit dlarrays?

Ich bräuchte eine Funktion, um ein überbestimmtes Gleichungssystem aus dlarrays zu lösen (Vergleichbar mit torch.linalg.lstsq).
Der backslash operator unterstützt dlarrays nicht und ich habe auch sonst keine Information zu einem Workaround gefunden. Welche Möglichkeiten gäbe es sonst in Matlab?

Answers (1)

Harald
Harald on 7 Jan 2025
Hallo,
mit extractdata ist es möglich, die hinter einem dlarray liegenden Daten zu bekommen.
Hilft dir das weiter? Falls nicht, bitte ein Beispiel eines dlarrays anhängen (.mat-Datei oder den Code, der es erzeugt).
Viele Grüße,
Harald

4 Comments

Hallo Harald,
Den gesamten Code zu posten ist leider etwas schwierig aber ich habe hier versucht ein anschauliches Beispiel zu erstellen (siehe unten). Wenn ich meine Lossfunction wie gezeigt definiere ist diese eine Funktion des parameters p und ich möchte anschließend auch den Gradienten des Losses in Bezug auf p auswerten.
Wenn ich p*A berechne und den Array dann extrahiere um das Gleichungssystem zu lösen und anschließend diese Lösung verwende um den Loss zu berechenen, dann unterbreche ich ja den Graphen und ich kann keine Backpropagation mehr verwenden oder habe ich das falsch verstanden?
LG Marian
% define the system of equations
A = rand(10, 5); % define the system matrix
f = rand(10, 1); % define the righthand side
% define the target result
x_target = rand(5, 1);
% create anonymus functions to wrap the system
loss = @(p) sqrt(sum(((p * A)\f - x_target).^2));
parameter = dlarray(10);
disp(['the current loss value is: ', num2str(loss(parameter))]);
% now i would like to derive the loss with respect to the parameter. And if
% A, f, and par are dlarrays it is not possible to use the backslash
% operator. The problem outlined above is a simplified version with a
% linear system where in the real problem the problem is non-linear and is
% solved in terms of a newton system where each newton step should be added to
% the computational graph as well.
Hallo Marian,
wenn du in deinem Code extractdata verwendest, funktioniert das zumindest soweit:
loss = @(p) sqrt(sum(((extractdata(p) * A)\f - x_target).^2));
Ob dir das weiterhilft, kann ich nicht beurteilen ohne zu verstehen, wie du genau damit weiterarbeiten willst.
Helfen kann auch, dass die Funktion zumindest im Falle skalarer Werte von p so umformuliert werden kann:
loss = @(p) sqrt(sum(( (A\f)/p - x_target).^2));
Falls du Ableitungen bilden möchtest, kann auch Symbolic Math Toolbox eine Alternative sein.
Viele Grüße,
Harald
Marian
Marian on 13 Jan 2025
Edited: Marian on 13 Jan 2025
Hallo Harald,
Danke für die schnelle Antwort! Das Ziel wäre, eine parametrisierte numerische Rechnung (die Lösung des linearen Gleichungssystems steht hier stellvertretend dafür) ableitbar zu machen, weshalb extract data ein Problem ist.
Die Umformung die du vorgeschlagen hast ist eine gute Idee aber im eigentlichen (nicht vereinfachten Beispiel) funktioniert das leider in dieser Form nicht.
Was die Symbolic Toolbox angeht so habe ich immer die Erfahrung gemacht, dass sie für kleine Probleme gut funktioniert aber sobald die analytischen Ausdrücke sehr groß werden muss man dann einiges an Geduld aufbringen um Ableitungen zu bilden. Da das numerische Modell das ich ableitbar machen möchte relativ viele Rechenoperationen beinhält, bin ich etwas Skeptisch ob das in diesem Fall funktioniert und ich hätte lieber eine automatic differentiation verwendet.
Ich habe in der Zwischenzeit einen ableitbaren QR-Solver implementiert der zwar etwas langsamer ist, seinen Zweck aber ansonsten erfüllt. Der MATLAB Support meinte, dass die Umsetzung eines ableitbaren Solvers momentan diskutiert wird und vielleicht in einem der kommenden Releases umgesetzt wird.
LG Marian
Hallo Marian,
danke für die Rückmeldung. Vielleicht kannst du deine Implementierung des ableitbaren QR-Solvers auch über File Exchange zur Verfügung stellen, falls andere das auch brauchen können.
Viele Grüße,
Harald

Sign in to comment.

Products

Release

R2024b

Asked:

on 17 Dec 2024

Edited:

on 13 Jan 2025

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!