Завершено
3
14.09.2022, 00:45
19.09.2022, 04:28
Реализовать класс 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
.