Thread: Matrices (+,-,*)

  1. #1
    Registered User hottiefee's Avatar
    Join Date
    Oct 2010
    Location
    TN, USA
    Posts
    32

    Question Matrices (+,-,*)

    Hi everyone. I am trying to create a matrix. I'm trying to write a matrix program that the user will input the matrices and the program will add, subtract, and multiply the 2 matrices.
    Before performing the required data manipulation, each function should validate its input arguments. The dimensions of the matrices involved in an operation must be compatible for that operation.

    I understand how to add and subtract matrices. I have been looking up how to multiply them. I understand that most of it will need revision. I have been getting confused lately in class.

    I need to figure out what all to put in the private section of the header file.
    Also, I don't quite understand the a.columns = b.rows; //i, j element of the product (line 22 in implementation/resource file). I understand a is the first array and b is the second and the columns of a array must equal rows of b array. But I don't know how to declare the arrays or when to use the (.) period.

    Here is what I have:
    (It's not completed. There are a LOT of things I put in not as code but as a reminder of what I need to do, from my notes...)

    Header
    Code:
    #ifndef MATRIX_H
    #define MATRIX_H
    using namespace std;
    class matrix{
    private:
    	int row, column;		//number of rows and columns used
    	double array[MAX_ROWS][MAX_COLUMNS];
    public:
    	matrix(double[][MAX_COLUMNS], int, int);
    	matrix& operator += (matrix);		// a+=b
    	matrix& operator *= (double);		// a*=3
    	friend matrix operator+(matrix, matrix);		//c=a+b
    	friend matrix operator*(double, matrix);		//b=3*a
    	friend matrix operator*(matrix, matrix);		//c=a*b
    	friend ostream& operator << (ostream&, const matrix&);		//displays
    };
    #endif;		//MATRIX_H
    Implementation
    Code:
    #include<iostream>
    #include"matrix.h"
    using namespace std;
    
    	const int MAX_ROWS = 3;
    	const int MAX_COLUMNS = 3;
    
    matrix& operator += (matrix){
    	int sum = 0;
    
    	if( = ){
    		+;
    		sum = ;
    	else
    		cout << "Arrays not same size";
    	}
    
    	return*this;
    }
    
    friend matrix operator * (matrix, matrix){		//multiply 2 matrices
    	a.columns = b.rows;		//i, j element of the product
    
    	double productArray[MAX_ROWS][MAX_COLUMNS];
    
    	if(columns = rows){
    		productArray[i][j] = 0;
    		for(k=0){
    			productArray[i][j] += a[i][k]*b[i][k];
    			productArray.rows = a.rows;
    			productArray.columns = b.columns;
    			
    			matrix c(productArray, rows, columns);
    			 
    			return c;
    		}
    	}
    	else
    		cout << "Error";
    	
    	return a;
    }
    Main
    Code:
    #include"matrix.h"
    #include<iostream>
    using namespace std;
    int main(){
    	double a[MAX_ROWS, MAX_COLUMNS];
    	for(int i=0; i<2; i++){
    		cout << "Enter three numbers: ";
    		for(int j=0; j<2; j++)
    			cin >> a[i][j];
    	}
    
    	matrix myMatrix (a,2,2);
    	myMatrix += myMatrix;
    	myMatrix b = myMatrix + 3 * matrix;
    	cout << b << endl;
    
    	return 0;
    }
    Any and all help will be appreciated. (: Thanks!

  2. #2
    -bleh-
    Join Date
    Aug 2010
    Location
    somewhere in this universe
    Posts
    463
    Code:
    	a.columns = b.rows;
    In order to multiply to matrices A and B, you need the numbers of collumns of A to be equal to the number of rows of matrix B. I think that line is supposed to be an if statement
    Code:
    matrix operator*(const matrix& a, const matrix & b)
    if( a.columns == b.rows)
        do matrix multiplication; 
    else
        print error;
    why do you have global variables max_col and max_row??? Are your matrices always 3x3? If the dimensions are allowed to change, what you did was incorrect. Since you don't know the size of array, you have to dynamically allocate memory and deep copy the value; or use std::vector or valarray. Remember, if you use "new" in the constructor, you have to write the destructor with "delete".

    Code:
    // constructor
    matrix( double A[][] , int n = 3 , int m = 3):row(n),collumn(m)
    {
       // deep copy the value of A into the dynamically allocated array; 
    }
    And for the business with the '.' dot, think of it as apostrophe s ' 's ', its job is to indicate a possessive case.
    Code:
    A.collumnns; // the collumn member of A
    Use it when you want to access members of a class.
    Last edited by nimitzhunter; 04-16-2011 at 08:43 PM.
    "All that we see or seem
    Is but a dream within a dream." - Poe

  3. #3
    Registered User hottiefee's Avatar
    Join Date
    Oct 2010
    Location
    TN, USA
    Posts
    32
    I changed the multiplication function to:
    Code:
    friend matrix operator * (matrix, matrix){		//multiply 2 matrices
    
    	double productArray[MAX_ROWS][MAX_COLUMNS];
    
    	if(a.columns = b.rows){			//i, j element of the product
    		productArray[i][j] = 0;
    		for(k=0){
    			productArray[i][j] += a[i][k]*b[i][k];
    			productArray.rows = a.rows;
    			productArray.columns = b.columns;
    			
    			matrix c(productArray, rows, columns);
    			 
    			return c;
    		}
    	}
    	else
    		cout << "Error";
    	
    	return a;
    }
    I get errors saying a and b are undeclared identifiers. Where would I declare them at?

    What exactly do you mean by deep copy?
    Thank you.

  4. #4
    Registered User hottiefee's Avatar
    Join Date
    Oct 2010
    Location
    TN, USA
    Posts
    32
    And yeah that makes sense with the period. thanx (:

  5. #5
    -bleh-
    Join Date
    Aug 2010
    Location
    somewhere in this universe
    Posts
    463
    Code:
    matrix operator*(const matrix& a, const matrix & b)
    since you're passing a class, you mostly never want to pass by value. always pass by reference.
    Last edited by nimitzhunter; 04-16-2011 at 08:49 PM.
    "All that we see or seem
    Is but a dream within a dream." - Poe

  6. #6
    Registered User hottiefee's Avatar
    Join Date
    Oct 2010
    Location
    TN, USA
    Posts
    32
    I understand that. It took away some of my errors. But how should I define the constructor in the header? and how do I use it in the main?

    sorry for all the questions. I just haven't had much time to study my book and I don't have that much time left before I'm done with the class... so thank you.

  7. #7
    -bleh-
    Join Date
    Aug 2010
    Location
    somewhere in this universe
    Posts
    463
    I already gave you the skeleton of the constructor which is based on the one you had before. For that constructor, write it in the implementation file. Here it is again:
    Code:
    // constructor
    matrix::matrix( double A[][] , int n = 3 , int m = 3):row(n),collumn(m)
    {
       // deep copy the value of A into the dynamically allocated array; 
    }
    To initialize a matrix in main using that constructor
    Code:
    double A[][] = something; 
    matrix matrixA (A,colum,row); // initialize matrixA
    you have to write the body of that constructor yourself.

    BTW, you're going to need the copy constructor and the assignment operator as well.
    Last edited by nimitzhunter; 04-16-2011 at 09:56 PM.
    "All that we see or seem
    Is but a dream within a dream." - Poe

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Matrices
    By YongzZ in forum C Programming
    Replies: 11
    Last Post: 05-13-2008, 10:01 PM
  2. Matrices
    By matrixhelp in forum C++ Programming
    Replies: 1
    Last Post: 03-06-2008, 08:53 PM
  3. Matrices
    By scottmanc in forum C++ Programming
    Replies: 0
    Last Post: 11-18-2003, 06:14 PM
  4. Matrices...
    By gcn_zelda in forum C++ Programming
    Replies: 5
    Last Post: 10-15-2003, 07:24 PM
  5. Matrices
    By Aakash Datt in forum C++ Programming
    Replies: 2
    Last Post: 06-09-2003, 07:10 PM

Tags for this Thread