From 91b0484a3a13144c5c7cd4c336eca38ebbc2875d Mon Sep 17 00:00:00 2001 From: barnestr Date: Tue, 29 Mar 2022 01:30:41 -0500 Subject: [PATCH] lab3 done --- Lab3/Lab3 | Bin 0 -> 72544 bytes Lab3/main.cpp | 63 +++++++++++++++++++++++++++-------- Lab3/matrix.cpp | 86 ++++++++++++++++++++++++++++++++---------------- 3 files changed, 108 insertions(+), 41 deletions(-) create mode 100755 Lab3/Lab3 diff --git a/Lab3/Lab3 b/Lab3/Lab3 new file mode 100755 index 0000000000000000000000000000000000000000..ad3c598699cf754e05b8d4dee4af454ea1d7d361 GIT binary patch literal 72544 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 rows; cout << "Enter the number of columns in the test matrix: " << endl; cin >> cols; + // Constructor Test Matrix m1(rows,cols); - // add more tests + Matrix m2(rows,cols); + // Assign various arbitrary values for(int i = 0; i < rows; i++){ for(int j = 0; j < cols; j++){ - m1[i][j] = 4.268394 + (i+7)*(j+7); + m1[i][j] = 12.181998*(1+(i*j)); + m2[i][j] = 1.0 + i; } - m1[0][0] = 4.20; - m1[0][1] = 6.9; - m1[0][2] = 1.337; - m1[0][3] = 12.18; - } - cout << m1 << endl; - m1*5; - cout << m1 << endl; - m1.clear(); - cout << m1; + // IO Test + cout << "m1:" << endl << m1; + // Copy Constructor Test with const + const Matrix m1copy(m1); + cout << "m1copy:" << endl << m1copy; + cout << "m2:" << endl << m2; + // Assignment Operator Test + m1 = m2; + cout << "m1 = m2:" << endl << m1; + // Transpose Test + m1 = ~m1; + cout << "~m1:" << endl << m1; + // Named Contructor Test + Matrix ident = Matrix::identity(4); + cout << "Identity matrix of size: " << rows << endl << ident; + Matrix m3(3,4); + Matrix m4(4,3); + for(int i = 0; i < 3; i++){ + for(int j = 0; j < 4; j++){ + m3[i][j] = 1 + i*j; + } + } + cout << "m3:" << endl << m3; + // Scalar Multiplication Test + m3 = 2.0*m3; + cout << "m3 = 2.0*m3" << endl << m3; + for(int i = 0; i < 4; i++){ + for(int j = 0; j < 3; j++){ + m4[i][j] = 2 + i*j; + } + } + cout << "m4:" << endl << m4; + Matrix m5(3,3); + // Matrix Multiplication Test + m5 = m3*m4; + cout << "m5 = m3*m4" << endl << m5; + // Clear Test + m5.clear(); + cout << "m5.clear()" << endl << m5; + + // Tested for memory leaks using valgrind: + // Result: "All heap blocks were freed -- no leaks are possible" + return 0; } diff --git a/Lab3/matrix.cpp b/Lab3/matrix.cpp index 637e35f..3a67460 100644 --- a/Lab3/matrix.cpp +++ b/Lab3/matrix.cpp @@ -1,7 +1,7 @@ /** * @file matrix.cpp * @author Trevor Barnes (barnestr@msoe.edu) - * @brief + * @brief Contains the main functionality for matrices of double values * @version 1.0 * @date 2022-03-29 * @@ -25,39 +25,55 @@ Matrix::Matrix(unsigned int rows, unsigned int cols){ this->cols = cols; // Create the row pointer this->the_matrix = new Row*[rows]; - for(int i = 0; i < rows+1; i++){ + for(int i = 0; i < rows; i++){ // Assign the rows of the matrix to new memory this->the_matrix[i] = new Row(cols); } } - + // Copy constructor Matrix::Matrix(const Matrix& from){ // New matrix gets row amount from "from" matrix this->rows = from.rows; - // New matrix gets row amount from "from" matrix + // New matrix gets col amount from "from" matrix this->cols = from.cols; // Create the row pointer with new row amount this->the_matrix = new Row*[rows]; - for(int i = 0; i < rows+1; i++){ + for(int i = 0; i < rows; i++){ // Set the pointer to each copied row - the_matrix[i] = new Row(from[i]); + this->the_matrix[i] = new Row(from[i]); } } // Destructor Matrix::~Matrix(){ - // Explicitly calls the destructor for each row in the matrix - for(int i = 0; i < rows+1; i++) { - the_matrix[i]->~Row(); + // Iterates through the pointer array and deletes each row's array + for(int i = 0; i < rows; i++) { + delete this->the_matrix[i]; } // Deletes the matrix itself delete[] the_matrix; } -// Assignment operator - TODO +// Assignment operator Matrix& Matrix::operator=(const Matrix& rhs){ - // finish + if(&rhs != this){ + if(rows > 0 && cols > 0){ + // Iterates through the pointer array and deletes each row's array + for(int i = 0; i < rows; i++) { + delete this->the_matrix[i]; + } + // Deletes the matrix itself + delete[] the_matrix; + } + this->rows = rhs.rows; + this->cols = rhs.cols; + this->the_matrix = new Row*[rows]; + for(int i = 0; i < rows; i++){ + // Set the pointer to each copied row + the_matrix[i] = new Row(rhs[i]); + } + } return *this; } @@ -67,7 +83,6 @@ Matrix Matrix::identity(unsigned int size){ if(size < 1){ throw(out_of_range("rows and cols must be greater than 0")); } - size--; // Create square matrix Matrix result(size, size); for(int i = 0; i < size; i++){ @@ -77,46 +92,62 @@ Matrix Matrix::identity(unsigned int size){ return result; } -// Matrix addition - TODO +// Matrix addition Matrix Matrix::operator+(const Matrix& rhs) const{ + if(rows != rhs.rows || cols != rhs.cols){ + throw(out_of_range("Matrices must be the same size")); + } Matrix result(this->rows, this->cols); - // finish + for(int i = 0; i < rows; i++){ + for(int j = 0; j < cols; j++){ + result[i][j] = (*the_matrix[i])[j] + rhs[i][j]; + } + } return result; } -// Matrix multiplication - TODO +// Matrix multiplication Matrix Matrix::operator*(const Matrix& rhs) const{ - if(rows != rhs.cols){ - throw(invalid_argument("1st matrix rows must equal 2nd matrix cols")); + if(cols != rhs.rows){ + throw(out_of_range("1st matrix rows must equal 2nd matrix cols")); } - //for(int i = 0; i < cols; i++) Matrix result(this->rows, rhs.cols); - // finish + for(int i = 0; i < this->rows; i++){ + for(int j = 0; j < rhs.cols; j++){ + result[i][j] = 0.0; + for(int k = 0; k < rhs.rows; k++){ + result[i][j] += (*the_matrix[i])[k]*rhs[k][j]; + } + } + } return result; } // Scalar multiplication Matrix Matrix::operator*(const double scale) const{ + Matrix result(this->rows, this->cols); for(int i = 0; i < rows; i++){ for(int j = 0; j < cols; j++){ - (*the_matrix[i])[j] = (*the_matrix[i])[j]*scale; + result[i][j] = (*the_matrix[i])[j]*scale; } } - Matrix result(this->rows, this->cols); - // finish return result; } -// Transpose of a Matrix - TODO +// Transpose of a Matrix Matrix Matrix::operator~() const{ Matrix result(this->cols, this->rows); - // finish + for(int i = 0; i < rows; i++){ + for(int j = 0; j < cols; j++){ + result[j][i] = (*the_matrix[i])[j]; + } + } return result; } // Clear Matrix void Matrix::clear(){ - for(int i = 0; i < rows+1; i++) { + for(int i = 0; i < rows; i++) { the_matrix[i]->clear(); } } @@ -139,7 +170,7 @@ const Row& Matrix::operator[](unsigned int row) const{ return *(the_matrix[row]); } -// print to output stream - TODO +// print to output stream void Matrix::out(std::ostream& os) const{ os << setprecision(4); os << "["; @@ -160,7 +191,6 @@ void Matrix::out(std::ostream& os) const{ } } os << "]" << endl; - // finish } // global insertion operator @@ -169,7 +199,7 @@ std::ostream& operator<<(std::ostream& os, const Matrix& rhs){ return os; } -// global scalar multiplication - TODO +// global scalar multiplication Matrix operator*(const double scale, const Matrix& rhs){ return rhs*scale; } \ No newline at end of file