Организация математических операций в С++
Рефераты >> Программирование и компьютеры >> Организация математических операций в С++

dim size_col() { return n; } // число столбцов

VARTYPE& operator() (dim x) const { return (*this)(x,0); } // элементу

// перегруженные операции и функции:

Matrix<VARTYPE>& operator=(const Matrix<VARTYPE>&);

Matrix<VARTYPE>& operator=(const VARTYPE&);

Matrix<VARTYPE> operator^(int); // возведение в степень

Matrix<VARTYPE> operator!(); // транспонирование

VARTYPE determ(); // определитель матрицы

VARTYPE vmodul(); // модуль вектора

Matrix& Gauss(dim,dim); // преобразование по Гауссу

// (для получ. обратной и единичной матрицы)

// (для получ. верхнетреугольной матрицы)

Matrix minor(dim,dim); // возвращает указ. минор матрицы

Vector line(dim i) // возвращает вектор-строку матрицы

{ return extract(1,n,i,0); }

Vector column(dim j) // возвращает вектор-столбец матрицы

{ return extract(m,1,0,j); }

VARTYPE& operator() (dim,dim) const; // доступ к

Matrix<VARTYPE>& operator<<=(const Matrix &A) { return newsize(A.m,A.n)=A; }

// безусловное приравнивание матриц

Matrix<VARTYPE>& insert(const Matrix&, dim=0, dim=0); // вставить часть матрицы

Matrix<VARTYPE> extract(dim, dim, dim=0, dim=0); // извлечь часть матрицы

Matrix<VARTYPE>& newsize(dim, dim=1); // установить новые размеры

void swap_line(dim, dim); //обмен строками матрицы

void swap_column(dim, dim); // обмен столбцами матрицы

friend Matrix<VARTYPE> operator+(const Matrix<VARTYPE>&,const Matrix<VARTYPE>&); //A-B

friend Matrix<VARTYPE> operator-(const Matrix<VARTYPE>&,const Matrix<VARTYPE>&); //A-B

friend Matrix<VARTYPE> operator*(const Matrix<VARTYPE>&,const Matrix<VARTYPE>&); //A*B

friend Matrix operator*(const double&,const Matrix<VARTYPE>&); //k*A

friend Matrix operator*(const Matrix<VARTYPE>&, const double&); //A*k

friend ostream& operator<<(ostream&,Matrix<VARTYPE>&);

// потоковый вывод матрицы

friend int operator>>(istream&,Matrix<VARTYPE>&);

// потоковый ввод существ. матрицы

// 0 - без. ошибок, 1 - была ошибка

dim read(ifstream&); // файловое чтение и запись матрицы

dim write(ofstream&); // в ее внутреннем, двоичном представлении.

friend VARTYPE operator %(const Matrix<VARTYPE>&,const Matrix<VARTYPE>&);

//Функция ошибок

void ERROR_MATRIX(dim) const;

};

// Реализация класса матриц

template <class VARTYPE>

Matrix<VARTYPE>::Matrix(dim M, dim N)

{

m=M;

n=N;

matr=new VARTYPE[m*n];

if(!matr) ERROR_MATRIX(1);

setmem(matr,sizeof(VARTYPE)*m*n,0);

}

template <class VARTYPE>

Matrix<VARTYPE>::Matrix(const Matrix<VARTYPE> &M_Obj) //Конструктор копирования

{

m=M_Obj.m;

n=M_Obj.n;

matr=new VARTYPE[m*n];

if(!matr) ERROR_MATRIX(1);

movmem(M_Obj.matr, matr, sizeof(VARTYPE)*m*n);

}

template <class VARTYPE>

Matrix<VARTYPE>& Matrix<VARTYPE>::operator=(const Matrix<VARTYPE> &M_Obj)

{

m=M_Obj.m;

n=M_Obj.n;

matr=new VARTYPE[m*n];

if(!matr) ERROR_MATRIX(1);

movmem(M_Obj.matr,matr,sizeof(VARTYPE)*m*n);

return *this;

}

//Диагональ?

template <class VARTYPE>

Matrix<VARTYPE>& Matrix<VARTYPE>::operator=(const VARTYPE &f)

{

for(int i=0,j;i<m;i++) for(j=0;j<n;j++)

if(i==j) (*this)(i,j)=f;

else (*this)(i,j)=0;

return *this;

}

template <class VARTYPE>

Matrix<VARTYPE> Matrix<VARTYPE>::operator^(int q) // Степень

{

if (q>0)

{

for(Matrix M=*this; q>1; q--)

M=M*(*this);

return M;

}

if (q!=-1) ERROR_MATRIX(3);

// вычисление обратной метoдом преобразований Гаусса

if (n!=m) ERROR_MATRIX(4);

Matrix M(m,2*n);

M.insert(*this);

for(int i=0;i<M.m;i++)

M(i,i+M.m)=1;

for(i=0;i<M.m;i++)

M.Gauss(i,i);

return M.extract(M.m,M.m,0,M.m);

}

template <class VARTYPE>

Matrix<VARTYPE> Matrix<VARTYPE>::operator!() // Транспозиция

{ Matrix<VARTYPE> A(n,m);

for(int i=0, j; i<m; i++)

for(j=0; j<n; j++)

A(j,i)=(*this)(i,j);

return A;

}

template <class VARTYPE>

VARTYPE Matrix<VARTYPE>::determ() // рекурсивно находит определитель матрицы

{

if (n!=m) ERROR_MATRIX(4);

if (n==1)

return (*this)(0,0);

for(int i=0; i<m; i++)

if ((*this)(i,0))

{

static Matrix<VARTYPE> M;

M <<= *this;

VARTYPE d=M(i,0)*(i%2?-1:1);

return d*M.Gauss(i,0).minor(i,0).determ();

}

return 0.0;

}

template <class VARTYPE>

VARTYPE Matrix<VARTYPE>::vmodul() // Модуль вектора

{

VARTYPE d=0;

if (n!=1) ERROR_MATRIX(9);

static Matrix<VARTYPE> M;

M <<= *this;

for(int i=0; i<m; i++)

d=d+M(i,0)*M(i,0);

return sqrt(d);

}

template <class VARTYPE>

Matrix<VARTYPE>& Matrix<VARTYPE>::Gauss(dim M, dim N)

{

Matrix<VARTYPE>& A=*this;

if (!A(M,N)) ERROR_MATRIX(5);

for(int i=0,j;i<m;i++)

for(j=0;j<n;j++)

if (i!=M && j!=N)

A(i,j)-=A(M,j)*A(i,N)/A(M,N);

for(j=0;j<n;j++)

if (j!=N)

A(M,j)/=A(M,N);

for(i=0;i<m;i++)

A(i,N)=0;

A(M,N)=1;

return *this;

}

template <class VARTYPE>

Matrix<VARTYPE> Matrix<VARTYPE>::minor(dim M, dim N) // возвращ. матрицу без

{ // строки y и столбца x

Matrix<VARTYPE> A(m-1,n-1);

for(int i=0,in=0,j,jn;i<m;i++)

if (i!=M)

{

for(j=0,jn=0;j<n;j++)

if (j!=N)

A(in,jn++)=(*this)(i,j);

in++;

}

return A;

}

template <class VARTYPE> // вставка

Matrix<VARTYPE>& Matrix<VARTYPE>::insert(const Matrix<VARTYPE> &A, dim M, dim N)

{

if (M+A.m>m || N+A.n>n) ERROR_MATRIX(6);

for(int i=0, j; i<A.m; i++)

for(j=0; j<A.n; j++)

(*this)(i+M,j+N)=A(i,j);

return *this;

}

template <class VARTYPE> // извлечение

Matrix<VARTYPE> Matrix<VARTYPE>::extract(dim LM, dim LN, dim M, dim N)

{

if (M+LM>m || N+LN>n) ERROR_MATRIX(7);

Matrix<VARTYPE> A(LM,LN);

for(int i=0, j; i<LM; i++)

for(j=0; j<LN; j++)

A(i,j)=(*this)(i+M,j+N);

return A;

}

template <class VARTYPE>

VARTYPE& Matrix<VARTYPE>::operator() (dim M, dim N) const

{ return *(matr+n*M+N); }

template <class VARTYPE>

Matrix<VARTYPE> operator+(const Matrix<VARTYPE> &A, const Matrix<VARTYPE>&B)


Страница: