Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как инвертировать матрицу?

01.01.2007
type 
 
RCOMat = array of array of Extended;
 
var
 
DimMat: integer;
 
procedure
InvertMatrix(var aa: RCOMat);
var
  numb
, nula1, ipiv, indxr, indxc: array of Integer;
  i
, j, l, kod, jmax, k, ll, icol, irow: Integer;
  amax
, d, c, pomos, big, dum, pivinv: Double;
  ind
: Boolean;
begin
 
for j := 0 to Pred(DimMat) do ipiv[j] := 0;
 
  irow
:= 1;
  icol
:= 1;
 
for i := 0 to Pred(DimMat) do
 
begin
    big
:= 0;
 
   
for j := 0 to Pred(DimMat) do
   
begin
     
if (ipiv[j] <> 1) then
     
begin
       
for k := 0 to Pred(DimMat) do
       
begin
         
if (ipiv[k] = 0) then
           
if (Abs(aa[j, k]) >= big) then
           
begin
              big  
:= Abs(aa[j, k]);
              irow
:= j;
              icol
:= k;
           
end
           
else;
       
end;
     
end;
   
end;
 
    ipiv
[icol] := ipiv[icol] + 1;
   
if (irow <> icol) then
   
begin
     
for l := 0 to Pred(DimMat) do
     
begin
        dum        
:= aa[irow, l];
        aa
[irow, l] := aa[icol, l];
        aa
[icol, l] := dum;
     
end;
     
for l := 0 to Pred(DimMat) do
     
begin
        dum
:= aa[irow + DimMat + 1, l];
        aa
[irow + DimMat + 1, l] := aa[icol + DimMat + 1, l];
        aa
[icol + DimMat + 1, l] := dum;
     
end;
   
end;
    indxr
[i] := irow;
    indxc
[i] := icol;
   
if (aa[icol, icol] = 0) then;
    pivinv        
:= 1.0 / aa[icol, icol];
    aa
[icol, icol] := 1.0;
   
for l := 0 to Pred(DimMat) do aa[icol, l] := aa[icol, l] * pivinv;
   
for l := 0 to Pred(DimMat) do aa[icol + DimMat + 1, l] :=
        aa
[icol + DimMat + 1, l] * pivinv;
   
for ll := 0 to Pred(DimMat) do
   
begin
     
if (ll <> icol) then
     
begin
        dum          
:= aa[ll, icol];
        aa
[ll, icol] := 0.0;
       
for l := 0 to Pred(DimMat) do aa[ll, l] := aa[ll, l] - aa[icol, l] * dum;
       
for l := 0 to Pred(DimMat) do aa[ll + DimMat + 1, l] :=
            aa
[ll + DimMat + 1, l] - aa[icol + DimMat + 1, l] * dum;
     
end;
   
end;
 
end;
 
 
for l := Pred(DimMat) downto 0 do
 
begin
   
if (indxr[l] <> indxc[l]) then
   
begin
     
for k := 0 to Pred(DimMat) do
     
begin
        dum
:= aa[k, indxr[l]];
        aa
[k, indxr[l]] := aa[k, indxc[l]];
        aa
[k, indxc[l]] := dum;
     
end;
   
end;
 
end;
end;

Взято с сайта https://www.swissdelphicenter.ch/en/tipsindex.php