игрыстатьиматематические программырусский языкразноеоб авторе

Матрицы

en

скачать исходный код

Чтобы понять, что написано в этом разделе, Вам необходимо знать, что такое матрицы. Программа демонстрирует объектно-ориентированное программирование. Реализована поддержка исключений, перегрузка операторов, работа с динамической памятью. Программу можно использовать для решения каких-либо математических задач, где необходимы матрицы и/или вектора. Пример был скомпилирован под Visual C++ 5.0

Создание матриц

Создание возможно в двух вариантах: с инициализацией и без инициализации. Для того, чтобы создать матрицу без инициализации надо в конструкторе указать её размерности. Например, Matrix M(3,3); создание матрицы 3 на 3.
Для создания и инициализации матрицы мы должны указать ещё и значения элементов. Например, Matrix M(2,2 ,1,0,0,1);- создаёт единичную матрицу 2 на 2. Все инициализирующие элементы должны быть либо типа double, либо типа int. Такое объявление переменной как Matrix M(2,2, 1.0,1,0,1); приведёт к труднонаходимой ошибке, так как первый элемент имеет тип double, а остальные типа int. Необходимо также указывать ВСЕ инициализирующие числа. Если вы задаёте матрицу 3 на 3, то необходимо указать 9 элементов инициализации или не одного. Если объявление произошло так: Matrix M(3); то матрица M будет иметь размер 1 х 1, а её элемент M(0,0) равен 3.

Получение доступа к элементам и размерностей

Для получения числа строк в матрице используется функция GetRows(), аналогично для получения числа столбцов используется функция GetCols()

Пример

Matrix M(3, 2);
int i = M.GetRows(); // i = 3
int j = M.GetCols(); // j = 2

Элементы матриц индексируются с нуля. Для доступа к ним используется перегруженная операция круглые скобки ()

Пример

Matrix M(2, 2, 1, 2, 3, 4);
int i = M(1, 0); // i = 3 equals to the element of the second row and first column

Операции

В примере реализованы только простейшие операции с матрицами сложение, вычитание, умножение, деление, транспонирование, деление/умножение на число, получение обратной матрицы, сложение/вычитание с числом (если матрица 1х1), присваивание, унарный + и унарный -.

Все операции имеют естественную запись. Для транспонирования возможны две альтернативные записи функция T и унарная звездочка

Пример

Matrix A(3, 2);
Matrix B = T(A);
Matrix C = *A; //matrices B and C are equal to transposition of matrix A.

Существует класс операций возможных при любых значениях параметров, например, умножение матрицы на число.
Другой класс операций возможны не всегда, например сложение двух матриц. Оно возможно только тогда когда обе матрицы имеют одинаковое число строк и столбцов. Например, нельзя сложить вектора (1,2,3) [это матрица 1 x 3] и (1,2) [это матрица 1 x 2]. При попытке выполнить сложение таких векторов возникает исключение. Соответствующий класс исключения называется CMatrixException. Конструкторы также могут вызывать исключение, если не удалось выделить память.

Преобразование типов

Реализовано преобразование в тип double, естественно с проверкой, что матрица размера 1 x 1.

Пример

Matrix A(1, 1, 3.4);
Matrix B(1.8);
double a = double(A); // a=3.4
double b = double(B); // b=1.8

Исключения

Код содержит класс MatrixException который используется когда невозможно выполнить некоторые операции.

Пример

#include "matrix.cpp"
void main() {
  try {
    Matrix A(3, 1, 1, 2, 3), B(2, 1, 1, 2); // creates two vectors
    double d = 2;
    Matrix C = T(B), D = *B; //  C = D = Transposition(B).
    A.Print(); // print content of the matrix
    Print(B); // print content of the matrix
    B /= d; // B=B/d;
    A = A + B; // addition
    int i = B.GetRows(); // i=2
    i = B.GetCols(); // i=1
    d = B(0, 0); // d=1
  } catch (CMatrixException Me) {
    Me.PrintMessage(); // Addition isn't possible
  }
}

Результат работы программы

Addition isn't possible [сложение невозможно]