#ifndef MATRIX_H #define MATRIX_H #include class Matrix { public: // Constructors & Destructor Matrix(); // Default constructor (creates an empty 0 x 0 matrix) Matrix(unsigned int rows, unsigned int cols, double fill); Matrix(const Matrix &other); ~Matrix(); Matrix& operator=(const Matrix &other); // Accessors for dimensions unsigned int num_rows() const; unsigned int num_cols() const; // Clears the matrix (deallocates any memory and sets size to 0 x 0) void clear(); // Safe accessor and modifier methods bool get(unsigned int row, unsigned int col, double &value) const; bool set(unsigned int row, unsigned int col, double value); // Simple matrix operations void multiply_by_coefficient(double coefficient); bool swap_row(unsigned int row1, unsigned int row2); void transpose(); // Binary matrix operations (modifies this matrix) bool add(const Matrix &other); bool subtract(const Matrix &other); // Advanced accessors: returns a dynamic array with the requested row or column. // The caller is responsible for deleting the returned array. double* get_row(unsigned int row) const; double* get_col(unsigned int col) const; // Quarter the matrix into four equally sized quadrants. // The four matrices are returned in a dynamically allocated array in the order: // UL, UR, LL, LR. // If the matrix is too small (i.e. less than 2 rows or 2 cols), returns four empty matrices. Matrix* quarter() const; // Equality operators bool operator==(const Matrix &other) const; bool operator!=(const Matrix &other) const; // Friend overloaded output operator for printing the matrix. friend std::ostream& operator<<(std::ostream &out, const Matrix &m); private: unsigned int rows; unsigned int cols; double** data; // Helper functions to allocate and deallocate the 2D array. void allocate(unsigned int r, unsigned int c, double fill); void deallocate(); }; #endif