Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тех прог.doc
Скачиваний:
38
Добавлен:
14.11.2019
Размер:
3.59 Mб
Скачать

Класс прямоугольных матриц

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

Работать с матрицей будем через указатель a на массив из указателей на вектора. Выражения типа a + 1 являются указателями на элементы массива указателей. Значения элементов массива указателей, то есть выражения типа *(a + 1) или a[1], являются указателями на вектора-столбцы матрицы. Выражения вида *a[1] есть отдельные вектора-столбцы матрицы. Для доступа к отдельным элементам матрицы можно использовать средства класса Vector.

Р ис. 80. Схема представления матрицы в памяти

Класс прямоугольных матриц поместим в модуль UnMatrix.

Объявление класса Matrix

Объявление класса матриц поместим в заголовочный файл UnMatrix.h.

// Файл UnMatrix.h

#ifndef UnMatrixH

#define UnMatrixH

#include "UnVector.h"

class Matrix{ // Матрица – совокупность векторов-столбцов

int nrow, ncol; // Число строк и столбцов матрицы

Vector **a; // Указатель на массив указателей на вектора-столбцы

public:

Matrix(int n = 1, int m = 1); // Конструктор

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

~Matrix(); // Деструктор

Matrix& operator=(const Matrix&); // Оператор присваивания

double& operator()(int i, int j) // Ссылка на элемент матрицы

{ return (*a[j])[i]; }

double operator()(int i, int j) const // Значение элемента матрицы

{ return (*a[j])[i]; }

Matrix operator~(); // Обращение матрицы

Matrix operator+(const Matrix&); // Сложение матриц

Matrix operator-(const Matrix&); // Вычитание матриц

Matrix operator*(const Matrix&); // Умножение матрицы на матрицу

Vector operator*(const Vector&); // Умножение матрицы на вектор

void SwapLines(int i, int j); // Поменять местами строки i и j

void DivLine(int i, double divisor); // Деление i-й строки на divisor

void DiffLines(int k, int i, double factor); // Вычитание из k-й строки

// i-й строки, умноженной на factor

Vector GetLine(int i); // Получить i-ю строку матрицы

struct MatrixException{ // Класс исключений

char* Mess; // Сообщение о проблеме

MatrixException(char* problem) // Конструктор класса исключений

{ Mess = problem; }

};

friend ostream& operator<<(ostream&, const Matrix&);// Вывод матрицы

friend istream& operator>>(istream&, Matrix&);// Ввод матрицы из потока

};

#endif

Для доступа к элементам матрицы перегружен оператор вызова функции (), что позволяет обращаться к j-му элементу i-й строки некоторой матрицы A в достаточно естественном виде A(i, j). В реализации данного оператора выражение *a[j] представляет j-й столбец матрицы, i - й элемент которого получается с помощью перегруженного оператора []. Неконстантный вариант оператора () возвращает ссылку на элемент матрицы, что позволяет изменять его, а константный вариант позволяет получать значение элемента матрицы.

Для обозначения унарной по своей природе операции обращения матрицы выбран унарный оператор ~.

В состав класса Matrix включен локальный класс MatrixException, предназначенный для передачи информации о возможных проблемах при обращении матриц.