Матрицы на языке C++. С применением объектно-ориентированного подхода. Были соблюдены нормы Google C++ Style Guide. Данный проект сделан с целью создания библиотек, изучения ооп. В этом проекте созданы различне операции по работе с матрицами.
- Исключения
- Ооп в матрицах
- Присваивание матрицы
- Создание матрицы
- Удаление матрицы
- Асессоры
- Мутаторы
- Умножение матрицы на число
- Cложение и вычитание матриц
- Умножение матрицы на матрицу
- Сравнение матриц
- Определитель
- Транспонирование
- Обратная матрица
- Матрица алгебраических дополнений
- Вывод матрицы
- Ввод в матрциу
- Библиотека
В случае когда данные операции или функции невозможны ,у меня вызываются исключения, прерывающие работу программы. (их можно отлавливать и продолжать работу).
throw std::invalid_argument("No correct")
Матрица представлена в виде класса.
class Matrix {...};
Класс находится в оболочке math
namespace math {
class Matrix {
....
};
} // namespace math
Так как необходимо было реализовывать деструктор, были реализованы все конструкции соответсвующие правилу пяти
Параметризированный конструктор представлен в виде
explicit Matrix(int rows, int cols);
Чтобы присвоить одну матрицу к другой, есть перегруженные операторы =
. Операторы перегружены только для присваивания матриц и перемещения одной матрицы в другую
Matrix &operator=(const Matrix &other) noexcept;
Matrix &operator=(Matrix &&other) noexcept;
Создание пустой матрицы.
int main() {
math::Matrix my_matrix;
}
Создание матрицы размера 4 на 9.
int main() {
math::Matrix my_matrix(4, 9);
}
Создание матрицы на основе другой матрицы
int main() {
math::Matrix my_matrix(4, 9);
math::Matrix my_new_matrix(my_matrix);
}
Создание новой матрицы с удалением старой
int main() {
math::Matrix my_matrix(4, 9);
math::Matrix my_new_matrix = std::move(my_matrix);
}
Удаление объекта происходит автоматически, когда он выходит за пределы видимости. Для этого используетс деструктор. Ни в коем случае его явно не вызывать. Для очистки элементов матрицы есть функция Clear()
int main() {
math::Matrix my_matrix(4, 9);
my_matrix.Clear()
}
Асессоры - используются для получения элементов из защищенный полей класса.
В классе есть 3 асессора:
GetRows() // получение размера строки матрицы
GetColumns() // получение размера стобцов матрицы
double &operator()(int i, int j) // Получение элемента и доступ к нему
Пример использования:
int main() {
math::Matrix my_matrix(4,9);
// доступ к элементу 0, 0
std::cout << my_matrix(0,0) << std::endl;
std::cout << my_matrix.GetRows() << std::endl;
}
Есть в коде перегруженный оператор[], он закоменчен не рекомедую к использованию, так как есть доступ к неинициализированной памяти.
Мутаторы - для присвоения значения.
В классе есть 3 асессора:
SetRows() // Задать размер строки матрицы
SetColumns() // Задать размер стобцов матрицы
SetRowsColumns(int rows, int cols);
double &operator()(int i, int j) // Присовение элемента и доступ к нему
Пример использования:
int main() {
math::Matrix my_matrix(4,9);
// доступ к элементу 0, 1
my_matrix(0, 1) = 5; // теперь он равер 5
my_matrix.SetRows() = 3;
}
Есть в коде перегруженный оператор[], он закоменчен не рекомедую к использованию, так как есть доступ к неинициализированной памяти.
Для умножения матрицы на число у меня есть следующие конструкции:
// умножит текущую матрицу на число изменив ее значение
void MulNumber(const double num) noexcept;
// умножит текущую матрицу на число не изменив ее значение и вернет новую матрицу
Matrix operator*(const double numbers) const noexcept;
// умножит число на матрицу не изменив ее и вернет новую матрицу
friend Matrix operator*(const double num, const Matrix& matrix);
int main() {
math::Matrix my_matrix(2, 2);
math::Matrix new_matrix;
new_matrix = my_matrix * 4.2;
mew_matrix = 4.2 * my_matrix;
my_matrix.MulNumber(4.2); // my_matrix == new_matrix
}
Для сложения и вычитания матриц, есть перегруженные функции и операторы.
// Присвивание или вычитание к текущей или из текущей матрицы с перезаписыванием
void SumMatrix(const Matrix &other); // +
void SubMatrix(const Matrix &othet); // -
Matrix &operator+=(const Matrix &other); // +=
Matrix &operator-=(const Matrix &other); // -=
// Без перезаписи с возвращением новой
Matrix operator+(const Matrix &other) const noexcept; // +
Matrix operator-(const Matrix &other) const noexcept; // -
int main() {
math::Matrix my_matrix(3,3);
math::Matrix old_matrix(3,3);
math::Matrix new_matrix;
new_matrix = my_matrix + old_matrix;
new_matrix.SubMatrix(old_matrix);
new_matrix.SumMatrix(old_matrix);
new_matrix = my_matrix - old_matrix;
new_matrix -= old_matrix;
new_matrix += my_matrix;
}
Конструкции:
// перезаписывание текущей
void MulMatrix(const Matrix &other);
Matrix &operator*=(const Matrix &other);
// без перезаписывания
Matrix operator*(const double numbers) const;
int main() {
math::Matrix my_first_matrix(1, 9);
math::Matrix my_second_matrix(9, 1);
math::Matrix matrix = my_first_matrix * my_second_matrix;
my_first_matrix *= my_second_matrix;
matri.MulMatrix(my_first_matrix);
}
Конструкции:
bool EqMatrix(const Matrix &other) const noexcept;
bool operator!=(const Matrix &other) const noexcept;
bool operator==(const Matrix &other) const noexcept;
int main() {
math::Matrix first_matrix(3,3);
math::Matrix second_matrix(3,3);
bool result;
first_matrix.EqMatrix(second_matrix);
result = (first_matrix == second_matrix);
result = (first_matrix != second_matrix);
}
Для нахождения определителя:
double Determinant() const;
int main() {
math::Matrix my_matrix;
double result;
result = my_matrix.Determinant();
}
Использован один из быстрых алгоритмов - нахождение определителя методом гауса.
Для нахождения транспонированной матрицы:
Matrix Transponse() const noexcept;
int main() {
math::Matrix my_matrix;
math::Matrix new_matrix;
new_matrix = my_matrix.Transponse();
}
при транспонирвоаниии вернет новую матрицу.
Для нахождения обратной матрицы:
Matrix InverseMatrix() const;
int main() {
math::Matrix my_matrix(4,4);
math::Matrix in_matrix;
in_matrix = my_matrix.InverseMatrix();
}
Для нахождения матрицы алгебраических дополнений:
Matrix CalcComplements() const;
int main() {
math::Matrix my_matrix(4, 4);
math::Matrix in_matrix;
}
Вывод всей матрицы:
friend std::ostream &operator<<(std::ostream &os, const Matrix &other);
int main() {
math::Matrix matrix(2, 3);
std::cout << matrix << std::endl;
/*0 0 0
0 0 0*/
}
int main() {
math::Matrix matrix(2, 2);
std::cin >> matrix;
}
Достаточно скачать себе два заголовычных файла, чтобы исполььзовать. Файлы с расширением .h .tpp. и подключить .h, .tpp в файле с проектом подключать не надо, он подключен в .h. .h и .tpp должны распологаться в одной директории.