Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Исходный код модуля для работы с матрицами ⇐ ПредыдущаяСтр 5 из 5 unit umatrix; interface uses Classes; type TMatrix = class(TComponent) private N: Integer; // Ðàçìåðíîñòü ìàòðèöû public Matrix: array of array of Real; // Ýëåìåíòû ìàòðèöû property Razmer: Integer read N; procedure Init(Num: Integer = 3); procedure ShowScreen; procedure LoadFromFile(FName: string); function Add(M2: Tmatrix): Tmatrix; function Sub(M2: Tmatrix): TMatrix; function Mult(M2: Tmatrix): tmatrix; function Obrat(): Tmatrix; function Transp(): Tmatrix; function NumMul(Num: Real): TMatrix; function Det(M: Tmatrix): Real; procedure Exchange_line(Nfirst, Nsecond: Integer); function getMatrix(M: TMatrix; Row, Col: Integer):TMatrix; end;
implementation
// Èíèöèàëèçàöèÿ ìàòðèöû procedure TMatrix.Init(Num: Integer = 3); var i: Integer; begin //Èíèöèàëèçàöèÿ ìàññèâà
N:= Num; SetLength(Matrix, N); for i:=0 to N-1 do SetLength(Matrix[i], N); end;
// Âûâîä ìàòðèöû íà ýêðàí procedure TMatrix.ShowScreen; var i, j: Integer; begin for i:= 0 to N-1 do for j:= 0 to N - 1 do Writeln(Matrix[i,j]); end;
// Ââîä ìàòðèöû èç ôàéëà ñ óêàçàííûì íàçâàíèåì procedure TMatrix.LoadFromFile(FName: string); var i,j: Integer; F: TextFile; begin AssignFile(F, FName); Reset(F); for i:= 0 to N - 1 do begin for j:= 0 to N - 1 do begin Read(F, Matrix[i,j]); end; Readln(F); end; CloseFile(F); end;
// Ñëîæåíèå äâóõ ìàòðèö + function TMatrix.Add(M2: Tmatrix): TMatrix; var i, j: Integer; Msum: TMatrix; begin Msum:= TMatrix.Create(Self); Msum.Init(Razmer);
for i:= 0 to N-1 do for j:= 0 to N-1 do begin Msum.Matrix[i,j]:= Matrix[i,j] + M2.Matrix[i,j]; end;
Result:= Msum; end;
// Âû÷èòàíèå äâóõ ìàòðèö + function TMatrix.Sub(M2: Tmatrix): TMatrix; var M: TMatrix; i, j: Integer; begin M:= TMatrix.Create(Self); M.Init(Razmer);
for i:= 0 to N-1 do for j:= 0 to N-1 do begin M.Matrix[i,j]:= Matrix[i,j] - M2.Matrix[i,j]; end;
Result:= M; end;
// Óìíîæåíèå äâóõ ìàòðèö + function TMatrix.Mult(M2: Tmatrix): TMatrix; var M: TMatrix; i, j, k: Integer;
begin M:= TMatrix.Create(Self); M.Init(M2.Razmer);
for i:= 0 to M2.Razmer - 1 do // ïåðåáèðàåì ñòðîêè begin for j:= 0 to M2.Razmer - 1 do begin for k:= 0 to M2.Razmer - 1 do begin M.Matrix[i,j]:= M.Matrix[i,j] + Self.Matrix[i,k] * M2.Matrix[k,j]; end; end; end;
Result:= M; end;
// Óìíîæåíèå ìàòðèöû íà ÷èñëî + function TMatrix.NumMul(Num: Real): TMatrix; var i, j: Integer; M: TMatrix; begin // Ñîçäàåì âñïîìîãàòåëüíóþ ìàòðèöó M:= TMatrix(Self); M.Init(Razmer);
for i:= 0 to N-1 do begin for j:= 0 to N-1 do begin M.Matrix[i,j]:= Num * Matrix[i,j]; end; end;
Result:= M;
end;
// Òðàíñïîíèðîâàííàÿ ìàòðèöà + function TMatrix.Transp: TMatrix; var M: TMatrix; i, j: Integer; begin M:= TMatrix.Create(Self); M.Init(Razmer);
for i:= 0 to Razmer - 1 do begin for j:= 0 to Razmer - 1 do begin M.Matrix[i,j]:= Matrix[j,i]; end; end;
Result:= M; // end;
// Ïîìåíÿòü ìåñòàìè äâå ñòðîêè + procedure TMatrix.Exchange_line(Nfirst, Nsecond: Integer); var temp: Real; i: Integer; begin
for i:= 0 to Razmer -1 do begin temp:= Matrix[Nfirst, i]; Matrix[Nfirst, i]:= Matrix[Nsecond, i]; Matrix[Nsecond, i]:= temp; end; end;
// Ïîëó÷åíèå ìàòðèöû + function TMatrix.getMatrix(M: TMatrix; Row, Col: Integer):TMatrix; var Res: TMatrix; i, j: Integer; ii, jj: Integer; begin Res:= TMatrix.Create(nil); Res.Init(M.Razmer - 1); ii:= 0; jj:= 0; for i:= 0 to Res.Razmer - 1 do begin if i >= Row then ii:= i + 1 else ii:= i; for j:= 0 to Res.Razmer - 1 do begin if j >= Col then jj:= j + 1 else jj:= j; Res.Matrix[i,j]:= M.Matrix[ii, jj]; end; end; Result:= Res; end;
function TMatrix.Det(M: TMatrix): Real; var i, j, znak: Integer; begin if M.Razmer = 1 then Result:= M.Matrix[1,1] else if M.Razmer = 2 then Result:= M.Matrix[0,0]*M.Matrix[1,1] - M.Matrix[0,1] * M.Matrix[1,0] else begin // Âû÷èñëÿåì îïðåäåëèòåëü ïî ñòðîêå for i:=0 to M.Razmer -1 do begin if Odd(i+1) then znak:= -1 else znak:= 1; Result:= Result + znak * M.Matrix[i, 1] * Self.Det(M.getMatrix(M, i, 1)); end;
end;
end;
// Îáðàòíàÿ ìàòðèöà function TMatrix.Obrat(): TMatrix; var dop, Temp: TMatrix; i, j, k: Integer; koef, koefStr: Real; begin // Ñîçäàåì åäåíè÷íóþ ìàòðèöó dop:= TMatrix.Create(Self); dop.Init(Self.Razmer); for i:= 0 to dop.Razmer - 1 do begin For j:= 0 to dop.Razmer - 1 do begin if (i <> j) then dop.Matrix[i,j]:= 0 else dop.Matrix[i,j]:= 1; end; end;
// Ñîçäàåì âñïîìîãàòåëüíóþ ìàòðèöó Temp:= TMatrix.Create(self); Temp.Init(Razmer); For i:= 0 to Razmer -1 do for j:= 0 to Razmer - 1 do Temp.Matrix[i, j]:= Matrix[i, j];
// Íà÷èíàåì ïðÿìîé õîä For i:= 0 to Razmer - 2 do begin if Temp.Matrix[i,i] = 0 then begin Temp.Exchange_line(i, i+1); dop.Exchange_line(i, i+1); end; koef:= Temp.Matrix[i,i];
// Äåëèì ñòðîêó íà êîýôôèöèåíò for j:= 0 to Razmer - 1 do begin Temp.Matrix[i, j]:= Temp.Matrix[i, j] / koef; dop.Matrix[i, j]:= dop.Matrix[i, j] / koef; end;
// âû÷èòàåì ñòðîêó èç îñòàëüíûõ for j:= i + 1 to Razmer -1 do begin koefStr:= Temp.Matrix[j, i]; for k:= 0 to Razmer - 1 do begin Temp.Matrix[j,k]:= Temp.Matrix[j,k] - koefStr*Temp.Matrix[i,k]; dop.Matrix[j,k]:= dop.Matrix[j,k] - koefStr*dop.Matrix[i,k]; end;
end;
end;
// Ïðåâðàùàåì ïîñëåäíèé ýëåìåíò â 1 koef:= Temp.Matrix[Razmer - 1, Razmer - 1]; for k:= 0 to Razmer - 1 do begin Temp.Matrix[Razmer - 1, k]:= Temp.Matrix[Razmer - 1, k] / koef; dop.Matrix[Razmer - 1, k]:= dop.Matrix[Razmer - 1, k] / koef; end; {}
// Îáðàòíûé õîä
for i:= Razmer - 1 downto 1 do begin for j:= i - 1 downto 0 do begin koefStr:= Temp.Matrix[j, i]; for k:= 0 to Razmer -1 do begin Temp.Matrix[j, k]:= Temp.Matrix[j,k] - Temp.Matrix[i,k]* koefStr; dop.Matrix[j, k]:= dop.Matrix[j,k] - dop.Matrix[i,k]* koefStr; end; end; end; {} Result:= dop; end; end.
|