Читайте также:
|
|
//T_CMATRIX.PAS
unit T_CMatrix;
interface
uses T_CVector,T_Complex;
type
TCMatrix=class(TCVector) {<-- Класс комплексных матриц (наследник от комплексных векторов)}
Row,Col:integer; //<-- Кол-во строк и столбцов
Matrix:array of CVector; //<-- Сама матрица
procedure SetDim(m,n:integer);
//<-- Установка размерности матрицы
constructor CMCreate(m,n:integer);
//<-- Создание матрицы m x n
private
protected
public
{Внутренние ф-ции}
function CMultMatOnDig(c:TComplex):TCMatrix;virtual;
//<-- Умножение матрицы на комплексное число
function CMTransp:TCMatrix;virtual;
//<-- Транспонирование матрицы
published
end;
{Внешние ф-ции}
function CMSumma(m1,m2:TCMatrix):TCMatrix;far; //<-- Сумма матриц
function CMRazn(m1,m2:TCMatrix):TCMatrix;far; //<-- Разность матриц
function CMMult(m1,m2:TCMatrix):TCMatrix;far; //<-- Произведение матриц
function CMEquiv(m1,m2:TCMatrix):Boolean;far; //<-- Сравнение матриц
implementation
constructor TCMatrix.CMCreate(m,n:integer);
// Создание матрицы
var i,j:integer;
begin
inherited Create; // Конструктор предка
SetDim(m,n);
// Вызываем наш метод установки размерности матрицы
for i:=0 to row-1 do
for j:=0 to col-1 do matrix[i,j]:=complex(0,0); // Сразу заносим нули
end;
procedure TCMatrix.SetDim(m,n:integer);
// Метод установки размерности матрицы
var i:integer;
begin
setlength(matrix,m);
for i:=0 to m-1 do setlength(matrix[i],n);
row:=m;
col:=n;
end;
function TCMatrix.CMultMatOnDig(c:TComplex): TCMatrix; // Умножение матрицы на комплексное число
var i,j:integer;temp:TCMatrix;
begin
temp:=TCMatrix.CMCreate(row,col);
// Создаём экземпляр объекта TCMatrix
for i:=0 to row-1 do
for j:=0 to col-1 do
begin
temp.matrix[i,j]:=CMult(matrix[i,j],c);
end;
result:=temp;
end;
function TCMatrix.CMTransp:TCMatrix;
// Транспонирование
var i,j:integer;temp:TCMatrix;
begin
temp:=TCMatrix.CMCreate(row,col);
for i:=0 to row-1 do
for j:=0 to col-1 do
temp.matrix[i,j]:=matrix[j,i];
result:=temp;
end;
function CMSumma(m1,m2:TCMatrix):TCMatrix;
var i:integer;temp:TCMatrix;
begin
if (m1.row<>m2.row) or (m1.col<>m2.col) then
// Если матрицы разных размеров
begin
result:=TCMatrix.CMCreate(0,0);
// результат - матрица нулевых размеров.
exit;
end;
// иначе
temp:=TCMatrix.CMCreate(m1.row,m1.col);
for i:=0 to m1.row-1 do
temp.matrix[i]:=CVSumma(m1.matrix[i],m2.matrix[i]);
result:=temp;
end;
function CMRazn(m1,m2:TCMatrix):TCMatrix;
var i:integer;temp:TCMatrix;
begin
if (m1.row<>m2.row) or (m1.col<>m2.col) then
// Если матрицы разных размеров
begin
result:=TCMatrix.CMCreate(0,0);
// результат - матрица нулевых размеров
exit;
end;
// иначе
temp:=TCMatrix.CMCreate(m1.row,m1.col);
for i:=0 to m1.row-1 do
temp.matrix[i]:=CVRazn(m1.matrix[i],m2.matrix[i]);
result:=temp;
end;
function CMMult(m1,m2:TCMatrix):TCMatrix;
var i,j,k:integer;temp:TCMatrix;
s:TComplex;
begin
if (m1.col<>m2.row) then
// Если матрицы разных размеров
begin
result:=TCMatrix.CMCreate(0,0);
// результат - матрица нулевых размеров
exit;
end;
// иначе
temp:=TCMatrix.CMCreate(m1.row,m2.col);
for i:=0 to m1.row-1 do
for j:=0 to m2.col-1 do begin
s:=Complex(0,0);
for k:=0 to m1.col-1 do s:=CSumma(s,CMult(m1.matrix[i,k],m2.matrix[k,j]));
temp.matrix[i,j]:=s;
end;
result:=temp;
end;
function CMEquiv(m1,m2:TCMatrix):Boolean;
// Сравнение матриц
var i:integer;
begin
result:=true;
if (m1.row<>m2.row) or (m1.col<>m2.col) then begin result:=false;exit end;
for i:=0 to m1.row do
if not CVEquiv(m1.matrix[i],m2.matrix[i]) then result:=false; // Используем сравнение векторов
end;
// End File!!!!!
end.
Дата добавления: 2015-07-25; просмотров: 41 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Класс действительных матриц | | | Класс полиномов |