- Delphiartiklar, tips, forum, länksamling - 

      

START | DELPHI | LÄNKARGÄSTBOK 




 Forum

Grundkurs
  »Introduktion
  »Snabbguide
  »Komponenter
  »Händelser
  »Strängar
  »Räkna med Delphi   »Egna typer
  »Selektion
  »Iteration
  »Menyer
  »Funktioner
  »Arraystrukturer

Tips & Tricks
  »Nya tips
  »Blandat
  »Databaser
  »Filer
  »Forms
  »Grafik
  »Internet
  »Komponenter
  »Matematik
  »Multimedia
  »Objekt/ActiveX
  »Skrivare
  »Strängar
  »System
  »Mest lästa tips

Artiklar
  »Delphi och ADO
  »Bygga en DLL
  »Skapa en enkel rapport
  »Hantera registret
  »Enheter, units
  »Klassen TCanvas
  »Använd LookUp Controls

 Nya tips
 Lägg till tips
 Delphilänkar
 Gästbok

 

Inveretra en matris Kategori: Matematik
Inlagt: 2007-04-26
Läst: 1594
Inlagt av: Staffan Berg
Beskrivning
Kod för att inverterna en matris (vända på den).
Kod
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; 
 

 
 
© Copyright 2005 - Staffan Berg
- Alla rättigheter förbehålles -