Открыто
20.04.2025, 12:09
29.05.2025, 08:01
Реализовать класс 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) -- оператор умножения числа на матрицу.
Т.е. левым операндом является число, а не матрица.
public методам, класса Matrix, 
необходимо добавить спецификаторы static и const. 
Но только в те места, где это необходимо.public и protected методы классов фиксированы, кроме спецификаторов. 
Т.е. нельзя менять названия методов, а также типы и количество аргументов.Matrix.hpp, Matrix.cpp.