RSS    

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

   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)

 

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

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

 

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)

 {

   Matrix<VARTYPE> C=A;

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

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

             C(i,j)+=B(i,j);

   return C;

 }

template <class VARTYPE>

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

 {

   Matrix<VARTYPE> C=A;

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

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

       C(i,j)-=B(i,j);

   return C;

 }

template <class VARTYPE>

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

{

  Matrix<VARTYPE> C(A.m,B.n);

  if (A.n!=B.m)

  {

    if(A.m==3 && A.n==1 && B.m==3 && B.n==1)

    {

      C(0)=A(1)*B(2)-A(2)*B(1);

      C(1)=A(2)*B(0)-A(0)*B(2);

      C(2)=A(0)*B(1)-A(1)*B(0);

    }

    else

      A.ERROR_MATRIX(2);

  }

  else

  {

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

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

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

              C(i,j)+=A(i,k)*B(k,j);

  }

  return C;

}

template <class VARTYPE>//умножение числа на матрицу

Matrix<VARTYPE> operator*(const double &f,const Matrix<VARTYPE> &A)

 {

   Matrix<VARTYPE> B=A;

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

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

       B(i,j)*=f;

   return B;

 }

template <class VARTYPE>// умножение матрицы на число

Matrix<VARTYPE> operator*(const Matrix<VARTYPE> &A, const double &f)

 {

   Matrix<VARTYPE> B=A;

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

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

       B(i,j)*=f;

   return B;

 }

template <class VARTYPE>

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

 { delete [] matr;

   m=M;

   n=N;

   if (N && M) { matr=new VARTYPE[m*n];

   if (!matr) ERROR_MATRIX(1);

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

    else { m=n=0; matr=(VARTYPE*)0; }

   return *this;

 }

template <class VARTYPE>

ostream& operator<<(ostream &out,Matrix<VARTYPE> &A)

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

      { for(j=0;j<A.size_col();j++)

            out << A(i,j)<< "  ";

            out<<endl;

      }

   return out;

 }

template <class VARTYPE>

int operator>>(istream &inp,Matrix<VARTYPE> &A)

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

      for(j=0;j<A.size_col();j++) if( !(inp>>A(i,j)) ) return 1;

   return 0;

 }

template <class VARTYPE>

void Matrix<VARTYPE>::swap_line(dim L1, dim L2)

 {

   if (L1==L2)

     return;

   double b;

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

     {

       b=(*this)(L1,j);

       (*this)(L1,j)=(*this)(L2,j);

       (*this)(L2,j)=b;

     }

 }

template <class VARTYPE>

void Matrix<VARTYPE>::swap_column(dim C1, dim C2)

 {

   if (C1==C2)

     return;

   double b;

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

    {

      b=(*this)(i,C1);

      (*this)(i,C1)=(*this)(i,C2);

      (*this)(i,C2)=b;

    }

 }

template <class VARTYPE>

dim Matrix<VARTYPE>::read(ifstream &finp)

 { (finp.get(m)).get(n); delete []matr; matr=new VARTYPE[m*n];

      if(!matr) ERROR_MATRIX(1);

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

   finp.read((char *)matr,sizeof(VARTYPE)*m*n); return finp.fail();

 }

template <class VARTYPE>

dim Matrix<VARTYPE>::write(ofstream &fout)

Страницы: 1, 2, 3, 4, 5


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.