RSS    

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

1.   Конструктор по умолчанию Matrix( ):

Конструктор по умолчанию создает матрицу нулевого размера. В дальнейшем размер этой матрицы можно изменить с помощью функции newsize(i, j).

2.   Конструктор с параметрами Matrix(dim, dim=1):

Это обычный конструктор с параметрами, который принимает в качестве параметров размеры матрицы и создает одномерный динамический массив размером m*n, где m – число строк, а n – число столбцов матрицы. С целью возможности использовать его для создания векторов, второй параметр конструктора задан как умалчиваемый со значением 1. Для первоначальной «инициализации» элементов матрицы нулями используется функция setmem( ).

3.   Конструктор копирования Matrix(const Matrix &):

Конструктор принимает в качестве параметра ссылку на объект класса (на существующую матрицу), определяет ее размер, выделяет для нее память и копирует в эту память содержимое матрицы, принимаемой по ссылке. Таким образом, создается точная копия матрицы с текущими значениями ее элементов.

4.   Деструктор ~Matrix( ):

Деструктор высвобождает память, выделенную конструкторами для элементов матрицы.

5.   Функция операции присваивания "=" Matrix& operator= (Matrix&):

Данная функция сравнивает адрес передаваемого по ссылке объекта с адресом собственного класса, чтобы не предпринялась попытка присвоит объект самому себе. После этого создается новый массив с числом элементов, равным числу элементов массива принимаемого по ссылке, и в этот массив заносится содержимое принимаемого массива. Возвращается разыменованный указатель this (return *this;).

6.   Функции операций суммирования, вычитания, умножения матриц и умножения матрицы на число:

Эти функции реализованы как дружественные функции и алгоритмы этих функций аналогичны по своему составу. Общий вид прототипа этих функций: friend Matrix operator @(const Matrix&, const Matrix&). Применение дружественных функций в данном случае целесообразно для того, чтобы иметь возможность передавать в оператор функцию объекты в любой последовательности. В этих операторах-функциях вначале создается временный объект типа матрица (с помощью конструктора копирования), в который копируется первая матрица и который при выходе из функции является возвращаемым объектом. Затем эта матрица суммируется (вычитается, умножается) с матрицей, стоящей после знака оператора по соответствующим правилам матричных операций. При этом для доступа к элементам матрицы и индексирования используются перегруженные операторы вызова функции operator( ) (dim x, dim x) и operator( ) (dim x).

7.   Функция – оператор Matrix operator^ (int):

Этот оператор-функция реализован как член класса и предназначен для возведения матрицы в степень. В случае, когда значение входного параметра равно минус единице осуществляется вызов функции вычисления обратной матрицы методом преобразований Гаусса, для чего разработана отдельная функция Matrix & Gauss(dim, dim). Таким образом, использование этого оператора позволяет решать систему линейных алгебраических уравнений в представлении X = (A^-1)*B, где X и B –вектора неизвестных и правых частей соответственно.

8.   Функция – оператор Matrix operator ! ( ):

Оператор для определения транспонированной матрицы.

9.   Функцияоператор friend VARTYPE operator %(const Matrix&, const Matrix&):

Функция вычисления скалярного произведения векторов. В ней в начале проверяется, являются ли передаваемые объекты векторами, а затем вычисляется скалярное произведение.

10.       Функции-члены VARTYPE determ( ) и VARTYPE vmodule( ):

Первая функция вычисляет определитель собственного объекта (матрицы). При этом используются функция Matrix & Gauss(dim, dim). Функция VARTYPE vmodule( ) вычисляет длину (модуль) вектора

11.       Функция операции вывода friend ostream& operator<<(ostream&, Matrix&):

Данная функция не может быть членом класса, поэтому чтобы иметь доступ к приватным элементам класса, она объявлена "дружественной" функцией. Она имеет два параметра: ссылку на поток, который находится слева от знака операции <<, и ссылку на объект, который находится слева от знака операции, данные этого объекта и будут выводиться. Затем следует форматированный вывод в поток всех элементов массива и возвращается поток. Если требуется вывести данные в файл, нужно открыть его присоединением к потоку ofstream.

12.        Функция операции ввода friend istream& operator>>(istream&, Matrix&):

Так же как и предыдущая, данная функция не может быть членом класса, а поэтому для доступа к приватным элементам класса объявлена "дружественной" функцией класса. Она так же имеет два параметра: ссылку на поток, который находится слева от знака >>, и ссылку объект, который находится слева от знака операции, в него и будут вводиться данные из потока. Затем следует ввод данных из потока в элементы массива и возвращается поток. Для ввода данных из файла, нужно открыть его присоединением к потоку ifstream.

13.       Функции-члены dim write(ofstream&) и dim read(ifstream&):

Функции предназначены для вывода в файл и ввода из файла матриц в из двоичном представлении. Для этого необходимо передать в них соответствующую ссылку на открытый файл.

14.       Функция void ERROR_MATRIX(dim):

Это функция-член, которая вызывается для фиксации некоторых ошибок при создании матриц и работе с ними, таких как отсутствие памяти, несогласованность размеров матриц при операции умножения, попытки вычислить отрицательную степень матрицы и т.п.

 

Листинг модуля с определением и реализацией класса матриц

// файл tmatr.cpp

#include <stdlib.h>

#include <mem.h>    // для setmem()

#include <fstream.h>

#include <math.h>

typedef unsigned char dim;

template <class VARTYPE> class Matrix {

typedef Matrix Vector;

private:

   VARTYPE *matr;   // указатель на массив матрицы

   dim m,n;                   // размеры матрицы

public:

// конструкторы и деструкторы:

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

   Matrix(dim,dim=1); // Обычный конструктор

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

   ~Matrix() { delete [ ]matr; }

// доступ к элементам матрицы

   dim size_row() { return m; }            // число строк

   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

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


Новости


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

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

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.