The mathematics background for calculating matrix
determinant higher than 2x2 can be found here.
Since the calculation of matrix determinant of higher
dimension, say 4x4, requires the calculation of matrix
determinant of its smaller 3x3. This indirectly tells
us that we need to make a recursive function,
Updated: I also include a faster algorithm using
Gauss-Jordan elimination.
This is my solution:
------------------------------------------------------
type
arr = array[1..4, 1..4] of real;
function determinant(a: arr; dim: integer): real;
var
new_a : arr;
j, c1, c2 : word;
sum, factor : real;
begin
if dim < 2 then
begin
writeln('Cannot determine determinant!');
determinant := 0;
end
else if dim = 2 then
begin
determinant := a[1,1]*a[2,2] - a[2,1]*a[1,2];
end else
begin
sum := 0;
for j:=1 to dim do
begin
{ Skip zero factors to speed up }
if (a[1,j] <> 0) then
begin
{ Creating new matrix }
for c1:=2 to dim do
for c2:=1 to dim do
begin
if c2 > j then new_a[c1-1,c2-1]:=a[c1,c2] else
if c2 < j then new_a[c1-1,c2]:= a[c1,c2];
end;
{ Recursive call to get the determinant of smaller }
{ matrix. Pay attention to this. }
factor := a[1,j]*determinant(new_a, dim-1);
{ The alternating law applies here }
if (j mod 2 = 0) then sum := sum - factor
else sum := sum + factor;
end;
end;
determinant := sum;
end;
end;
------------------------------------------------------
Roby Joehanes, © 2001