- محاسبه ی دترمینان یک ماتریس با هر اندازه ای
دوره ی دانشجویی ماتریس Sparse رو نوشته بودم و حالا ساده شده ی همون رو براتون می گذارم.
فرمولی که استفاده شده یک فرمول بازگشتی من درآوردی هست! البته بعد از زیر و رو کردن اینترنت فهمیدم که به فرمول درستی رسیدم:
Determinant( Matrix[n x n] ) = Sigma[i from 1 to n] { -1^(i +1) * Value[1, i] * Determinant( SubMatrixFrom[1, i] ) }
کد برنامه رو براتون می گذارم.
امیدوارم روزی به کار کسی بیاد و ما رو هم دعا کنه!
type
TMatrix = array of array of record
Value: real;
Flag: integer;
end;
function GetMatSize(Matrix: TMatrix): integer;
var
i, j: integer;
begin
Result := 0;
for i := 0 to length(Matrix) -1 do
if Result = 0 then
for j := 0 to length(Matrix) -1 do
if Matrix[i, j].Flag = 0 then
inc(Result);
end;
function Determinant(Matrix: TMatrix; yid: integer = 0): real;
var
i, j, k, sign: integer;
begin
Result := 0;
if GetMatSize(Matrix) = 1 then
begin
for i := 0 to length(Matrix) -1 do
if Matrix[yid, i].Flag = 0 then
Break;
Result := Matrix[yid, i].Value;
Exit;
end;
sign := 1;
for k := 0 to length(Matrix) -1 do
Matrix[yid, k].Flag := Matrix[yid, k].Flag +1;
for j := 0 to length(Matrix) -1 do
if Matrix[yid, j].Flag = 1 then
begin
for k := 0 to length(Matrix) -1 do
Matrix[k, j].Flag := Matrix[k, j].Flag +1;
Result := Result + sign * Matrix[yid, j].Value * Determinant(Matrix, yid +1);
sign := -sign;
for k := 0 to length(Matrix) -1 do
Matrix[k, j].Flag := Matrix[k, j].Flag -1;
end;
for k := 0 to length(Matrix) -1 do
Matrix[yid, k].Flag := Matrix[yid, k].Flag -1;
end;
مثال:
procedure TForm1.Button1Click(Sender: TObject);
var
n, i, j: integer;
Mat: TMatrix;
det: real;
begin
n := 3;
SetLength(Mat, n);
for i := 0 to length(Mat) -1 do
begin
SetLength(Mat[i], n);
for j := 0 to length(Mat[i]) -1 do
Mat[i, j].Flag := 0;
end;
Mat[0, 0].Value := 1;
Mat[0, 1].Value := 0;
Mat[0, 2].Value := 3;
Mat[1, 0].Value := 4;
Mat[1, 1].Value := 5;
Mat[1, 2].Value := 0;
Mat[2, 0].Value := 7;
Mat[2, 1].Value := 0;
Mat[2, 2].Value := 9;
det := Determinant(Mat);
ShowMessage(Format('Determinant is %0.3f', [det]));
end;





پاسخ با نقل قول
