MF_inv MD_inv ME_inv
MCF_inv MCD_inv MCE_inv
MF_invwEdit MD_invwEdit ME_invwEdit
MCF_invwEdit MCD_invwEdit MCE_invwEdit
   
MFb_inv MDb_inv MEb_inv
MCFb_inv MCDb_inv MCEb_inv
MFb_invwEdit MDb_invwEdit MEb_invwEdit
MCFb_invwEdit MCDb_invwEdit MCEb_invwEdit
   
MFb_inv_sizeBuf MDb_inv_sizeBuf MEb_inv_sizeBuf
MCFb_inv_sizeBuf MCDb_inv_sizeBuf MCEb_inv_sizeBuf
   
MFsym_inv MDsym_inv MEsym_inv
FunktionMatrix-Inversion
Syntax C/C++#include <MFstd.h>
int MF_inv( fMatrix MInv, fMatrix MA, ui len );
int MF_invwEdit( fMatrix MInv, fMatrix MA, ui len, float thresh );
int MCF_invwEdit( cfMatrix MInv, cfMatrix MA, ui len, float thresh );
int MFb_inv( fMatrix MInv, fMatrix MA, ui len, fVector Buf );
int MFb_invwEdit( fMatrix MInv, fMatrix MA, ui len, float thresh, fVector Buf );
int MCFb_invwEdit( cfMatrix MInv, cfMatrix MA, ui len, float thresh, cfVector Buf );
ui MFb_inv_sizeBuf( ui len );
int MFsym_inv( fMatrix MInv, fMatrix MA, ui len );
C++ MatObj#include <OptiVec.h>
void matrix<T>::inv( const matrix<T>& MA );
void matrix<T>::invwEdit( const matrix<T>& MA, T thresh ); void matrix<complex<T>>::invwEdit( const matrix<complex<T>>& MA, T thresh );
void matrix<T>::b_inv( const matrix<T>& MA, vector<T>& Buf );
void matrix<T>::b_invwEdit( const matrix<T>& MA, T thresh, vector<T>& Buf );
void matrix<complex<T>>::invwEdit( const matrix<complex<T>>& MA, T thresh, vector<T>& Buf );
ui matrix<T>::b_inv_sizeBuf( const ui len );
void matrix<T>::sym_inv( const matrix<T>& MA );
Pascal/Delphiuses MFstd;
function MF_inv( MInv, MA:fMatrix; len:UIntSize ):Integer;
function MF_invwEdit( MInv, MA:fMatrix; len:UIntSize; thresh:Single ):Integer;
function MCF_invwEdit( MInv, MA:cfMatrix; len:UIntSize; thresh:Single ):Integer;
function MFb_inv( MInv, MA:fMatrix; len:UIntSize; Buf:fVector ):Integer;
function MFb_invwEdit( MInv, MA:fMatrix; len:UIntSize; thresh:Single; Buf:fVector ):Integer;
function MCFb_invwEdit( MInv, MA:cfMatrix; len:UIntSize; thresh:Single; Buf:fVector ):Integer;
function MFb_inv_sizeBuf( len:UIntSize ):UIntSize;
function MFsym_inv( MInv, MA:fMatrix; len:UIntSize ):Integer;
BeschreibungDie Inverse der Matrix MA wird in MInv gespeichert. Falls MA nicht regulär ist, also nicht invertiert werden kann, gibt MF_inv einen Fehler-Code zurück. Im allgemeinen Fall, MF_inv, wird die Inversion über LU-Faktorisierung mit partieller Pivotisierung durchgeführt. Im speziellen Fall symmetrischer Matrizen bietet MFsym_inv einen im Erfolgsfall etwa doppelt so schnellen Weg der Invertierung.

Um bei MF_inv ein Scheitern der Invertierung zu verhindern, kann ein Minimalwert für die Pivotisierung festgelegt werden. Standardmäßig ist diese 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_invwEdit, die die gewünschte Editier-Schwelle als zusätzliches Argument thresh übernimmt.
Der Rückgabewert von MF_inv und MF_invwEdit zeigt an, ob die Invertierung erfolgreich war:
 
RückgabewertBedeutung
0Matrix MA ist regulär und konnte erfolgreich invertiert werden
1Matrix MA ist singulär; Ergebnis MInv komplett unbrauchbar
2Matrix MA (nahezu) singulär; konnte nur durch Pivot-Editierung invertiert werden; ob das Ergebnis brauchbar ist, hängt von der spezifischen Anwendung ab

Um zu prüfen, ob MF_inv erfolgreich war, kann in Single-Thread-Programmen auch MF_LUDresult aufgerufen werden, deren Rückgabewert FALSE (0) sein wird, wenn MA fehlerfrei und ohne Pivot-Editierung invertiert werden konnte, und TRUE (1) für eine singuläre Eingabe-Matrix MA. Da in Multithread-Programmen ggf. nicht klar ist, auf welche Instanz von MF_inv sich MF_LUDresult bezieht, sollte hier nicht MF_LUDresult aufgerufen, sondern immer nur der Rückgabewert von MF_inv ü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_inv_sizeBuf() abgefragt werden (Angabe nicht in byte, sondern als Zahl der Elemente von Buf im jeweiligen Datentyp!).

Wie erwähnt können symmetrische Matrizen u.U. wesentlich schneller mittels MFsym_inv invertiert werden. Syntax und Bedeutung des Rückgabewerts sind identisch mit MF_inv. Diese Funktion versucht zunächst Cholesky-Faktorisierung. Nur falls diese nicht erfolgreich ist (sich die Eingabe-Matrix also als nicht-positiv-definit herausstellt), wird doch der Weg über LUD beschritten.

RückgabewertEin Code 0, 1 oder 2; siehe oben
QuerverweisKap. 10

MatrixLib Inhaltsverzeichnis  OptiVec Home