Блок задач

3. Простые классы

Сложность 3

Задача «Простой класс матрицы»

Реализовать класс Matrix для работы с матрицами NxM.

Постановка задачи

Реализовать класс Matrix в соответствии с указанным интерфейсом. public и protected методы классов фиксированы, кроме спецификаторов. Т.е. нельзя менять названия методов, а также типы и количество аргументов. НО в этих методах отсутствуют спецификаторы const и static, которые были удалены намеренно. Их необходимо вернуть на место.

private поля и private методы можно добавлять в класс Matrix.

//Matrix.hpp
class Matrix final {
public:
  Matrix();
  Matrix(size_t cols);
  Matrix(size_t rows, size_t cols);
  ~Matrix();

  Matrix(const Matrix& mat);

  Matrix operator*(const Matrix& mat);
  Matrix operator-(const Matrix& mat);
  Matrix operator+(const Matrix& mat);

  Matrix operator*(double value);
  Matrix operator/(double value);

  Matrix& operator=(const Matrix& mat);
  Matrix& operator*=(const Matrix& mat);
  Matrix& operator+=(const Matrix& mat);
  Matrix& operator-=(const Matrix& mat);

  Matrix& operator*=(double value);
  Matrix& operator/=(double value);

  bool isValid();

  void resize(size_t rows, size_t cols);

  const double& coeffRef(size_t rowIdx, size_t colIdx) const;
  double& coeffRef(size_t rowIdx, size_t colIdx);

  const double* data() const;
  double* data();

  size_t rows();
  size_t cols();

  Matrix& setIdentity();
  Matrix& setZero();
  Matrix& setConstants(double value);

  Matrix& setIdentity(size_t rows, size_t cols);
  Matrix& setZero(size_t rows, size_t cols);
  Matrix& setConstants(size_t rows, size_t cols, double value);

  Matrix transpose();
  Matrix inverse();
  double det();

  Matrix identity(size_t rows, size_t cols);
  Matrix zeros(size_t rows, size_t cols);
  Matrix constants(size_t rows, size_t cols, double value);

  friend Matrix operator*(double value, const Matrix& mat);
};
  • Matrix() -- конструктор по умолчанию.

  • Matrix(size_t cols) -- конструктор для создания вектор (матрицы с одной строкой). cols -- размер вектора.

  • Matrix(size_t rows, size_t cols) -- конструктор с параметрами. rows -- количество строк, cols -- количество столбцов.

  • ~Matrix() -- деструктор.

  • Matrix(const Matrix& mat) -- конструктор копий. Выполняет полное копирование матрицы.

  • operator*(const Matrix& mat) -- оператор умножения матриц. При невозможности выполнения операции возвращает Matrix().

  • operator-(const Matrix& mat) -- оператор вычитания матриц. При невозможности выполнения операции возвращает Matrix().

  • operator+(const Matrix& mat) -- оператор сложения матриц. При невозможности выполнения операции возвращает Matrix().

  • operator*(double value) -- оператор умножения на число.

  • operator/(double value) -- оператор деления на число.

  • operator=(const Matrix& mat) -- оператор присваивания. Выполняет полное копирование матрицы.

  • operator*=(const Matrix& mat) -- совмещенный оператор умножения и присваивания. При невозможности выполнения операции объект, который вызывал данный оператор становится невалидным. Т.е. при вызове метода isValid(), он вернет false.

  • operator+=(const Matrix& mat) -- совмещенный оператор сложения и присваивания. При невозможности выполнения операции объект, который вызывал данный оператор становится невалидным. Т.е. при вызове метода isValid(), он вернет false.

  • operator-=(const Matrix& mat) -- совмещенный оператор вычитания и присваивания. При невозможности выполнения операции объект, который вызывал данный оператор становится невалидным. Т.е. при вызове метода isValid(), он вернет false.

  • operator*=(double value) -- совмещенный оператор умножения на число и присваивания.

  • operator/=(double value) -- совмещенный оператор деления на число и присваивания.

  • isValid() -- проверка матрицы на валидность. Если матрица невалидна, то метод возвращает false, иначе true. Для пустой матрицы: isValid() == false.

  • resize(size_t rows, size_t cols) -- меняет размер матрицы.

  • coeffRef(size_t rowIdx, size_t colIdx) const -- доступ к элементу (i, j). Возвращает константную ссылку на элемент матрицы. При выходе за границу матрицы кидаем exception: throw std::out_of_range("message");.

  • coeffRef(size_t rowIdx, size_t colIdx) -- доступ к элементу (i, j). Возвращает ссылку на элемент матрицы. При выходе за границу матрицы кидаем exception: throw std::out_of_range("message");.

  • data() const -- возвращает указатель на константные элементы матрицы.

  • data() -- возвращает указатель на элементы матрицы.

  • rows() -- возвращает общее количество строк в матрице.

  • cols() -- возвращает общее количество столбцов в матрице.

  • setIdentity() -- делает матрицу единичной. Возвращает ссылку на объект, вызвавший этот метод.

  • setZero() -- заполняет матрицу нулями. Возвращает ссылку на объект, вызвавший этот метод.

  • setConstants(double value) -- заполняет матрицу константными значениями value. Возвращает ссылку на объект, вызвавший этот метод.

  • setIdentity(size_t rows, size_t cols) -- задает новый размер матрице и делает матрицу единичной. Возвращает ссылку на объект, вызвавший этот метод.

  • setZero(size_t rows, size_t cols) -- задает новый размер матрице и заполняет матрицу нулями. Возвращает ссылку на объект, вызвавший этот метод.

  • setConstants(size_t rows, size_t cols, double value) -- задает новый размер матрице и заполняет матрицу константными значениями value. Возвращает ссылку на объект, вызвавший этот метод.

  • transpose() -- транспонирует матрицу.

  • inverse() -- вычисляет обратную матрицу. При невозможности выполнения операции метод возвращает Matrix().

  • det() -- вычисляет определитель матрицы. При невозможности выполнения операции метод возвращает NAN.

  • identity(size_t rows, size_t cols) -- создает новую матрицу и делает матрицу единичной. Возвращает созданную матрицу.

  • zero(size_t rows, size_t cols) -- создает новую матрицу и заполняет матрицу нулями. Возвращает созданную матрицу.

  • constants(size_t rows, size_t cols, double value) -- создает новую матрицу и заполняет матрицу константными значениями value. Возвращает созданную матрицу.

  • operator*(double value, const Matrix& mat) -- оператор умножения числа на матрицу. Т.е. левым операндом является число, а не матрица.

Требования

  1. К public методам, класса Matrix, необходимо добавить спецификаторы static и const. Но только в те места, где это необходимо.
  2. public и protected методы классов фиксированы, кроме спецификаторов. Т.е. нельзя менять названия методов, а также типы и количество аргументов.
  3. Названия header и source файлов следующие: Matrix.hpp, Matrix.cpp.
  4. Написать unit test'ы для реализованного класса.