unit matrix;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
type
FLOAT = single;
{ TMatrix2x2 }
TMatrix2x2 = class
private
_data: array [0..1, 0..1] of FLOAT;
procedure Clear;
public
constructor Create;
constructor Create(aData: array of FLOAT);
function ToString: string; override;
end;
{ TMatrix3x3 }
TMatrix3x3 = class
private
_data: array [0..2, 0..2] of FLOAT;
procedure Clear;
public
constructor Create;
constructor Create(aData: array of FLOAT);
function ToString: string; override;
class function SubMatrix(matrix: TMatrix3x3; row, column: integer): TMatrix2x2;
end;
implementation
{ TMatrix2x2 }
procedure TMatrix2x2.Clear;
var
row, column: integer;
begin
for row := 0 to 1 do
for column := 0 to 1 do
_data[row, column] := 0;
end;
constructor TMatrix2x2.Create;
begin
Clear;
end;
constructor TMatrix2x2.Create(aData: array of FLOAT);
var
row, column: integer;
begin
if Length(aData) <> 4 then exit;
for row := 0 to 1 do
for column := 0 to 1 do
_data[row, column] := aData[column + row * 2];
end;
function TMatrix2x2.ToString: string;
begin
result := Format('%1.2f, %1.2f, %1.2f, %1.2f',
[_data[0, 0], _data[1, 0],
_data[0, 1], _data[1, 1]]);
end;
{ TMatrix3x3 }
procedure TMatrix3x3.Clear;
var
row, column: integer;
begin
for row := 0 to 2 do
for column := 0 to 2 do
_data[row, column] := 0;
end;
constructor TMatrix3x3.Create;
begin
Clear;
end;
constructor TMatrix3x3.Create(aData: array of FLOAT);
var
row, column: integer;
begin
if Length(aData) <> 9 then exit;
for row := 0 to 2 do
for column := 0 to 2 do
_data[row, column] := aData[column + 3 * row];
end;
function TMatrix3x3.ToString: string;
begin
result := Format('%1.2f, %1.2f, %1.2f, %1.2f, %1.2f, %1.2f, %1.2f, %1.2f, %1.2f',
[_data[0, 0], _data[0, 1], _data[0, 2],
_data[1, 0], _data[1, 1], _data[1, 2],
_data[2, 0], _data[2, 1], _data[2, 2]]);
end;
class function TMatrix3x3.SubMatrix(matrix: TMatrix3x3; row, column: integer
): TMatrix2x2;
var
sub: array [0..3] of FLOAT;
value: FLOAT;
i, x, y: integer;
begin
i := 0;
for y := 0 to 2 do
begin
if y <> row then
begin
for x := 0 to 2 do
if x <> column then
begin
value := matrix._data[row, column];
sub[i] := value;
inc(i);
end;
end;
end;
result := TMatrix2x2.Create(sub);
end;
end.