MF_LUdecompose MD_LUdecompose ME_LUdecompose
MCF_LUdecompose MCD_LUdecompose MCE_LUdecompose
MF_LUdecomposewEdit MD_LUdecomposewEdit ME_LUdecomposewEdit
MCF_LUdecomposewEdit MCD_LUdecomposewEdit MCE_LUdecomposewEdit
   
MFb_LUdecompose MDb_LUdecompose MEb_LUdecompose
MCFb_LUdecompose MCDb_LUdecompose MCEb_LUdecompose
MFb_LUdecomposewEdit MDb_LUdecomposewEdit MEb_LUdecomposewEdit
MCFb_LUdecomposewEdit MCDb_LUdecomposewEdit MCEb_LUdecomposewEdit
   
MFb_LUdecompose_sizeBuf MDb_LUdecompose_sizeBuf MEb_LUdecompose_sizeBuf
MCFb_LUdecompose_sizeBuf MCDb_LUdecompose_sizeBuf MCEb_LUdecompose_sizeBuf
FunktionLU-Faktorisierung (engl. LU decomposition)
Syntax C/C++#include <MFstd.h>
int MF_LUdecompose( fMatrix MLU, uiVector Ind, fMatrix MA, ui len );
int MF_LUdecomposewEdit( fMatrix MLU, uiVector Ind, fMatrix MA, ui len, float thresh );
int MCF_LUdecomposewEdit( cfMatrix MLU, uiVector Ind, cfMatrix MA, ui len, float thresh );
int MFb_LUdecompose( fMatrix MLU, uiVector Ind, fMatrix MA, ui len, fVector Buf );
int MFb_LUdecomposewEdit( fMatrix MLU, uiVector Ind, fMatrix MA, ui len, float thresh, fVector Buf );
int MCFb_LUdecomposewEdit( cfMatrix MLU, uiVector Ind, cfMatrix MA, ui len, float thresh, cfVector Buf );
ui MFb_LUdecompose_sizeBuf( ui len );
C++ MatObj#include <OptiVec.h>
void matrix<T>::LUdecompose( vector<ui> Ind, const matrix<T>& MA );
void matrix<T>::LUdecompose( vector<ui>* Ind, const matrix<T>& MA );
void matrix<T>::LUdecomposewEdit( vector<ui> Ind, const matrix<T>& MA, const T& thresh );
void matrix<T>::LUdecomposewEdit( vector<ui>* Ind, const matrix<T>& MA, const T& thresh );
void matrix<complex<T>>::LUdecomposewEdit( vector<ui>* Ind, const matrix<complex<T>>& MA, const T& thresh );
void matrix<T>::b_LUdecompose( vector<ui> Ind, const matrix<T>& MA, vector<T> Buf );
void matrix<T>::b_LUdecompose( vector<ui>* Ind, const matrix<T>& MA, vector<T> Buf );
void matrix<T>::b_LUdecomposewEdit( vector<ui> Ind, const matrix<T>& MA, const T& thresh, vector<T> Buf );
void matrix<T>::b_LUdecomposewEdit( vector<ui>* Ind, const matrix<T>& MA, const T& thresh, vector<T> Buf );
void matrix<complex<T>>::b_LUdecomposewEdit( vector<ui>* Ind, const matrix<complex<T>>& MA, const T& thresh, vector<complex<T>> Buf );
ui matrix<T>::b_LUdecompose_sizeBuf();
Pascal/Delphiuses MFstd;
function MF_LUdecompose( MLU:fMatrix; Ind:uiVector; MA:fMatrix; len:UIntSize ):Integer;
function MF_LUdecomposewEdit( MLU:fMatrix; Ind:uiVector; MA:fMatrix; len:UIntSize; thresh:Single ):Integer;
function MCF_LUdecomposewEdit( MLU:cfMatrix; Ind:uiVector; MA:cfMatrix; len:UIntSize; thresh:Single ):Integer;
function MFb_LUdecompose( MLU:fMatrix; Ind:uiVector; MA:fMatrix; len:UIntSize; Buf:fVector ):Integer;
function MFb_LUdecomposewEdit( MLU:fMatrix; Ind:uiVector; MA:fMatrix; len:UIntSize; thresh:Single; Buf:fVector ):Integer;
function MCFb_LUdecomposewEdit( MLU:cfMatrix; Ind:uiVector; MA:cfMatrix; len:UIntSize; thresh:Single; Buf:cfVector ):Integer;
function MFb_LUdecompose_sizeBuf( len:UIntSize ):UIntSize;
BeschreibungMA wird in ein Produkt MA = L * U zerlegt, wobei L eine untere Dreiecksmatrix ist (engl. lower-triangular), deren Diagonal-Elemente alle gleich 1 sind, und U ist eine obere Dreiecks-Matrix (engl. upper-triangular). Da die Gesamtzahl der nicht-trivialen Elemente von L und U gerade in eine Matrix derselben Dimensionen wie MA paßt, wird das Ergebnis in einer einzelnen Matrix MLU anstelle von getrennten Matrizen L und U abgelegt. Tatsächlich sind es auch gar nicht die "wahren" Matrizen L und U, die zu MLU kombiniert werden, sondern eine Zeilen-Permutation, deren Indizes in dem Vektor Ind angegeben sind.

MA darf von MLU überschrieben werden, falls gewünscht.

Es gibt Anwendungen, wo es sinnvoll ist, (nahezu) singuläre Matrizen durch "Pivot-Editierung" zerlegbar zu machen, indem man für die bei der Zerlegung verwandte partielle Pivotisierung einen Minimalwert festlegt. Falls bei der Pivotisierung kein Diagonal-Element gefunden werden kann, das betragsmäßig größer als der Minimalwert ist, wird auf diesen anstelle des verschwindenden Diagonalelementes normalisiert. Auf diese Weise werden Divisionen durch Zahlen nahe oder gleich Null vermieden.
Standardmäßig ist Pivot-Editierung ausgeschaltet. Um sie für alle Aufrufe von MF_LUdecompose sowie den auf LU-Zerlegung basierenden Funktionen MF_inv und MF_solve einzuschalten, kann MF_LUDsetEdit aufgerufen werden. Da diese Methode nicht fiber-sicher ist, sollte sie aber nicht angewandt werden, um bei verschiedenen Aufrufen von MF_LUdecompose, MF_inv oder MF_solve verschiedene Minimalwerte einzustellen. Zu diesem Zweck dient vielmehr die Funktion MF_LUdecomposewEdit, die die gewünschte Editier-Schwelle als zusätzliches Argument thresh übernimmt.
Der Rückgabewert von MF_LUdecompose und MF_LUdecomposewEdit zeigt an, ob die Zerlegung erfolgreich war und ob die Anzahl der Permutationen gerade war oder ungerade:
 
RückgabewertBedeutung
0Matrix singulär, Ergebnis komplett unbrauchbar
+1Matrix erfolgreich zerlegt; gerade Anzahl von Permutationen
-1Matrix erfolgreich zerlegt; ungerade Anzahl von Permutationen
+2Matrix nahezu singulär; konnte durch Pivot-Editierung zerlegt werden; Ergebnis nur teilweise brauchbar; gerade Anzahl von Permutationen
+2Matrix nahezu singulär; konnte durch Pivot-Editierung zerlegt werden; Ergebnis nur teilweise brauchbar; ungerade Anzahl von Permutationen

Um zu prüfen, ob MF_LUdecompose erfolgreich war, kann in Single-Thread-Programmen auch MF_LUDresult aufgerufen werden, deren Rückgabewert FALSE (0) sein wird, wenn MA fehlerfrei faktorisiert werden konnte, und TRUE (1) für eine singuläre Eingabe-Matrix A. Da in Multithread-Programmen ggf. nicht klar ist, auf welche Instanz von MF_LUdecompose sich MF_LUDresult bezieht, sollte hier nicht MF_LUDresult aufgerufen, sondern immer nur der Rückgabewert von MF_LUdecompose überprüft werden.

Diese Funktionen benötigen Pufferspeicher. Die "Normal-Versionen" (Präfix MF_, MCF_ usw.) allozieren ihn selbst, während die Versionen mit den Präfixen MFb_, MCFb_ etc. als zusätzliches Aufruf-Argument einen Vektor Buf übernehmen. Die erforderliche Größe von Buf kann mittels Aufruf von MFb_LUdecompose_sizeBuf() abgefragt werden (Angabe nicht in byte, sondern als Zahl der Elemente von Buf im jeweiligen Datentyp!).

FehlerbehandlungIm Falle einer singulären Matrix bleibt MLU undefiniert, und der Rückgabewert wird auf 0 bzw. +-2 gesetzt. Zusätzlich wird ein internes Register gesetzt, das durch Aufruf von MF_LUDresult ausgelesen werden kann.
RückgabewertCode 0, +-1 oder +-2, der Erfolg sowie gerade oder ungerade Anzahl von Zeilen-Permutationen anzeigt, s.o.
QuerverweisKap. 10

MatrixLib Inhaltsverzeichnis  OptiVec Home