## Matrix C++ program

I recently went back to my c++ matrix calculator program and noticed it needed some improving so here are the improvements along with the source code.

Download the c++ matrix calculator here

Firstly I have added add/minus features to it. I accidentaly forgot to code these last time but have included them in the new program with the commands add and min. A note on the code, all the min function actually does is reverse all the signs on the second matrix and then call add.

I have also allowed you to determine both the number of rows and columns in the matrix to give it more flexibility. However this is not extended to the transformations (rotate and reflect) which still only work in 3 dimensions. Also in this process I have changed the lgth variable in the matrix to colls so that it now has rows and colls.

Finally to avoid some errors i have ensured all answer matrices are assigned colls and rows values.

Please feel free to use the program and don’t be put off by the fact it uses a command prompt, just type help to see the list of commands and when you type the command followed by enter it will give you step by step guidance on what to do.

David Woodford

// matrix.cpp : main project file.

#include “stdafx.h”

#include <iostream>

#include <cmath>

#include <string>

using namespace std;

class mat

{

public:

double mata[20][10];

int colls;

int rows;

void dimmat()

{

cout << “enter collums of matrix” << endl;

cin >> colls;

cout << “enter rows of matrix” << endl;

cin >> rows;

// cout << “” << endl;

for(int n=0;n<rows;n++)

{

cout << “enter values for row” << n << ” , each followed by ‘enter’:” << endl;

for(int m=0;m<colls;m++)

{

cin >> mata[n][m];

}

}

}

void display()

{

int rcount = 0;

int ccount = 0;

while(rcount < rows)

{

while(ccount < colls)

{

//cout << “matrix:”<<endl;

cout << mata[rcount][ccount] << ” , “;

ccount++;

}

cout << ‘\n’;

ccount=0;

rcount++;

}

}

/*void rotate()

{

mat mat2;

mat2.dimmat();

mat mat3;

mat3 = mult(this, mat2);

}*/

};

mat mult(mat A, mat B)

{

cout << “multiply started” << endl;

//char pause;

mat ans;

ans.colls=B.colls;

ans.rows=A.rows;

int rcount = 0;

int ccount = 0;

int c2 = 0;

while(rcount < 3)

{

//cout << “row: ” << rcount << ” started” << endl;

while(ccount < A.colls)

{

//cout << “collum: ” << ccount << “started” << endl;

ans.mata[rcount][ccount] = 0;

while(c2 < A.rows)

{

ans.mata[rcount][ccount] = ans.mata[rcount][ccount] + (A.mata[rcount][c2] * B.mata[c2][ccount]);

c2++;

}

//cout << “value is: ” << ans.mata[rcount][ccount] << endl;

//cin >> pause;

c2=0;

ccount++;

}

ccount=0;

rcount++;

}

if(A.colls != B.rows)

{

cout <<“matrices are wrong sizes to be multiplied” << endl;

return A;

}

else

{

ans.display();

return ans;

}

}

mat add(mat A, mat B)

{

mat ans;

if(A.colls == B.colls && A.rows == B.rows)

{

ans.colls = A.colls;

ans.rows=A.rows;

int i = 0;

int j = 0;

while(i < ans.colls)

{

j=0;

while(j<ans.rows)

{

ans.mata[i][j] = A.mata[i][j] + B.mata[i][j];

j++;

}

i++;

}

return ans;

}

else

{

cout << “matricies cannot be added : diffrent lengths” << endl;

return A;

}

}

mat minus(mat A, mat B)

{

int i =0;

int j =0;

while(i<B.colls)

{

while(j<B.rows)

{

B.mata[i][j] = 0 – B.mata[i][j];

j++;

}

j=0;

i++;

}

return add(A,B);

}

mat rotate(mat A, int angle)

{

mat T;

T.colls = 3;

mat matans;

//creat transformation matrix

double pi = 3.14159265;

double theta = (angle*pi)/180;

T.mata[0][0] = cos(theta);

T.mata[0][1] = 0 – sin(theta);

T.mata[0][2] = 0;

T.mata[1][0] = sin(theta);

T.mata[1][1] = cos(theta);

T.mata[1][2] = 0;

T.mata[2][0] = 0;

T.mata[2][1] = 0;

T.mata[2][2] = 1;

matans = mult(T, A);

return matans;

}

mat reflect(mat A, int angle)

{

mat matans;

mat T;

T.colls = 3;

//creat transformation matrix

double pi = 3.14159265;

double theta = (angle*pi)/180;

T.mata[0][0] = cos(2 * theta);

T.mata[0][1] = sin(2 * theta);

T.mata[0][2] = 0;

T.mata[1][0] = sin(2*theta);

T.mata[1][1] = 0 – cos(2*theta);

T.mata[1][2] = 0;

T.mata[2][0] = 0;

T.mata[2][1] = 0;

T.mata[2][2] = 1;

matans = mult(T, A);

return matans;

}

void input()

{

string dim = “dim”;

string com;

int end = 0;

mat matans;

int matcount = 0;

mat mats[11];

while(end == 0)

{

cout << “enter command>”;

getline(cin, com);

if(dim == com)

{

cout << “matrix” << matcount <<endl;

mats[matcount].dimmat();

matcount++;

}

if(com == “rot”)

{

cout << “which matirx?” <<endl;

int matnum;

cin >> matnum;

cout << “what angle (degrees)” << endl;

int rotang;

cin >> rotang;

matans = rotate(mats[matnum], rotang);

mats[10] = matans;

}

if(com == “rlt”)

{

cout << “which matirx?” <<endl;

int matnum;

cin >> matnum;

cout << “what angle (degrees)” << endl;

int rotang;

cin >> rotang;

matans = reflect(mats[matnum], rotang);

mats[10] = matans;

}

if(com == “ans”)

{

matans.display();

}

if(com == “mlt”)

{

cout << “first matrix” << endl;

int mat1;

cin >> mat1;

cout << “second matirx” << endl;

int mat2;

cin >> mat2;

matans = mult(mats[mat1], mats[mat2]);

mats[10] = matans;

}

if(com == “add”)

{

cout << “enter first matrix” << endl;

int A;

int B;

cin >> A;

cout << “enter second matrix” << endl;

cin >> B;

matans = add(mats[A],mats[B]);

mats[10] = matans;

matans.display();

}

if(com == “min”)

{

cout << “enter first matrix” << endl;

int mata, matb;

cin >> mata;

cout << “enter second matrix” << endl;

cin >> matb;

matans = minus(mats[mata], mats[matb]);

mats[10] = matans;

matans.display();

}

if(com == “dsp”)

{

cout << “which matirx?” << endl;

int matdsp;

cin >> matdsp;

mats[matdsp].display();

}

if(com == “let”)

{

cout << “which matirx?” << endl;

int mat1;

cin >> mat1;

int mat2;

cout <<“eaqual to (10 is answer matrix)” << endl;

cin >> mat2;

mats[mat1] = mats[mat2];

}

if(com == “help”)

{

cout <<“Davids Woodfords matrix calculator” << endl;

cout << “takes the following commands” << endl;

cout <<” ‘dim’ :: allows you to dfine a matrix”<< endl;

cout <<” ‘rot’ :: roates a matrix through an agnle” << endl;

cout <<” ‘rlt’ :: reflects a matrix through the line y=tan(a) where a is given” << endl;

cout <<” ‘ans’ :: displays the answer to the last calculation” << endl;

cout <<” ‘mlt’ :: lets u multiply 2 matricies together” << endl;

cout <<” ‘dsp’ :: displays a matrix specified”<<endl;

cout <<” ‘let’ :: allows u to assign one matrix the value of another, eg answer”<<endl;

cout <<” ‘add’ :: lets u add 2 matricies together” << endl;

cout <<” ‘min’ :: lets u minus 2 matricies together” << endl;

cout<<“===================================================================”<<endl;

cout <<“matricies are sotred in an array of 10, with numerical values starting at 0″<<endl;

cout<<“matrix 10 is the answer matrix”<<endl;

cout<<“any parameters will be asked for wen needed”<<endl;

}

}

}

int main()

{

cout << “Welcome to David Woodfords Matrix calculator” << endl << endl;

cout<<“type ‘help’ for a list of commands” <<endl;

// mat mata;

// mata.dimmat();

/* mat matb;

matb.dimmat();

mat matans;

matans = mult(mata, matb);

// mata.display();

*/

//rotate(mata, 30);

input();

return 0;

}

## Matrix Multiplication

This is a simple tutorial on how to multiply 2 matrices together. You can speed up doing this using my c++ matrix calculator (download matrix calculator) but I strongly recommend learning how to do them long hand first as you should only use formulae and program that you understand how they work. Multiplying matrices is a useful thing to know as it enables complex algebra to be simplified and i used extensively in 3d computer graphics.

**What Matrices can i Multiply Together**

You may fin it surprising that only certain size matrices can be multiplied together, this is because of the way the multiplication is done and how the size of the answer is determined.

The size of a matrix is given as rows by columns

eg) 2 3 1

3 6 1

is a 2×3 matrix. When multiply matrices the columns of the first matrix must be equal to the rows of the second. The size of the new matrix is given by the rows of the first by the columns of the second

eg) Fig1

**How is the multiplication Done**

The way in which matrix multiplication is done is surprisingly simple. Go to the first point in the new matrix. Look at the row it is in and go to the start of that row in the first matrix and the start of the column it is in in the second matrix. Multiply these to numbers together, then move along one in the first matrix and down one in the second matrix and multiply these together. Keep going till you have reached the end of the row of the first matrix, now add all of these values up and that is the first value for your new matrix.

So you go to the row in the first, the column in the second, times each pair of values and add them up for each value.

In the above diagram (fig 1)

u=ag + bk

v=ah+bl

w=ai+bm

x=cg+dk

y=ch+dl

and so on….

That may sound a little confusing but you’ll soon get used to it and it is very useful. If you want to practise and check your answers please download my c++ matrix calculator, the command for multiply is mlt, though you will have to define you matrices using the dim command first. All the data it needs off you is asked for

If you have any comments please leave them below or email me at woodford_4@hotmail.co.uk

## Matrix Calculator, C++ Program by David Woodford

Ive been learning c++ and doing matrices in maths as well so I’ve decided to combine to the two in a simple command based program. The basic idea of the program is that it can quickly multiply matrices together and perform reflection and rotation transformations on them. Below is a download of the program and the source code. In the following weeks ill also make some tutorials on doing matrices by hand (click here for my multiplication lesson). Later im hoping to add some more features to it like finding the inverse matrix and the determinate

So how to use the program, well first of all type help. This will then display a list of the commands and what they do. When using it type your command, eg mlt, on its own, the program will then ask you to enter which is the first matrix and the second matrix in the multiplication. Every value should have the enter key pressed after its typed.

The program allows up to 10 matrices to be stored in memory plus the answer to the last calculation. They are stored in an array and are given numerical values. The first one you define, using dim, is matrix 0 the second is matrix 1 etc. The answer to the last calculation is matrix 10. When the program ask you which matrix you want to use it is asking you to enter this value for the matrix

Using the let command allows you to give one matrix the value of another. The first matrix number you enter is the one that the values being assigned to, the second is the value thats being assigned. This command is useful if you want to store the answer, after youve done the next calculation, to do this type let, when prompted type matrix that you want to be given the value of the answer and then give the value 10 for the value its being assigned.

Below is the code, i wrote it in visual c++ 2008, for the program. You may have to make changes if you using a diffrent complier to the includes at the top.

Enjoy using, but only to check, note all angles are in degrees recomplie if you want radians.

// matrix.cpp : main project file.

#include “stdafx.h”

#include <iostream>

#include <cmath>

#include <string>

using namespace std;

class mat

{

public:

double mata[20][3];

int lgth;

void dimmat()

{

cout << “enter length of matrix” << endl;

cin >> lgth;

// cout << “” << endl;

for(int n=0;n<3;n++)

{

cout << “enter values for row” << n << ” , each followed by ‘enter’:” << endl;

for(int m=0;m<lgth;m++)

{

cin >> mata[n][m];

}

}

}

void display()

{

int rcount = 0;

int ccount = 0;

while(rcount < 3)

{

while(ccount < lgth)

{

//cout << “matrix:”<<endl;

cout << mata[rcount][ccount] << ” , “;

ccount++;

}

cout << ‘\n’;

ccount=0;

rcount++;

}

}

/*void rotate()

{

mat mat2;

mat2.dimmat();

mat mat3;

mat3 = mult(this, mat2);

}*/

};

mat mult(mat A, mat B)

{

cout << “multiply started” << endl;

//char pause;

mat ans;

ans.lgth=B.lgth;

int rcount = 0;

int ccount = 0;

int c2 = 0;

while(rcount < 3)

{

//cout << “row: ” << rcount << ” started” << endl;

while(ccount < A.lgth)

{

//cout << “collum: ” << ccount << “started” << endl;

ans.mata[rcount][ccount] = 0;

while(c2 < 3)

{

ans.mata[rcount][ccount] = ans.mata[rcount][ccount] + (A.mata[rcount][c2] * B.mata[c2][ccount]);

c2++;

}

//cout << “value is: ” << ans.mata[rcount][ccount] << endl;

//cin >> pause;

c2=0;

ccount++;

}

ccount=0;

rcount++;

}

int smelly;

ans.display();

return ans;

}

mat rotate(mat A, int angle)

{

mat T;

T.lgth = 3;

mat matans;

//creat transformation matrix

double pi = 3.14159265;

double theta = (angle*pi)/180;

T.mata[0][0] = cos(theta);

T.mata[0][1] = 0 – sin(theta);

T.mata[0][2] = 0;

T.mata[1][0] = sin(theta);

T.mata[1][1] = cos(theta);

T.mata[1][2] = 0;

T.mata[2][0] = 0;

T.mata[2][1] = 0;

T.mata[2][2] = 1;

matans = mult(T, A);

return matans;

}

mat reflect(mat A, int angle)

{

mat matans;

mat T;

T.lgth = 3;

//creat transformation matrix

double pi = 3.14159265;

double theta = (angle*pi)/180;

T.mata[0][0] = cos(2 * theta);

T.mata[0][1] = sin(2 * theta);

T.mata[0][2] = 0;

T.mata[1][0] = sin(2*theta);

T.mata[1][1] = 0 – cos(2*theta);

T.mata[1][2] = 0;

T.mata[2][0] = 0;

T.mata[2][1] = 0;

T.mata[2][2] = 1;

matans = mult(T, A);

return matans;

}

void input()

{

string dim = “dim”;

string com;

int end = 0;

mat matans;

int matcount = 0;

mat mats[11];

while(end == 0)

{

cout << “enter command>”;

getline(cin, com);

if(dim == com)

{

cout << “matrix” << matcount <<endl;

mats[matcount].dimmat();

matcount++;

}

if(com == “rot”)

{

cout << “which matirx?” <<endl;

int matnum;

cin >> matnum;

cout << “what angle (degrees)” << endl;

int rotang;

cin >> rotang;

matans = rotate(mats[matnum], rotang);

mats[10] = matans;

}

if(com == “rlt”)

{

cout << “which matirx?” <<endl;

int matnum;

cin >> matnum;

cout << “what angle (degrees)” << endl;

int rotang;

cin >> rotang;

matans = reflect(mats[matnum], rotang);

mats[10] = matans;

}

if(com == “ans”)

{

matans.display();

}

if(com == “mlt”)

{

cout << “first matrix” << endl;

int mat1;

cin >> mat1;

cout << “second matirx” << endl;

int mat2;

cin >> mat2;

matans = mult(mats[mat1], mats[mat2]);

mats[10] = matans;

}

if(com == “dsp”)

{

cout << “which matirx?” << endl;

int matdsp;

cin >> matdsp;

mats[matdsp].display();

}

if(com == “let”)

{

cout << “which matirx?” << endl;

int mat1;

cin >> mat1;

int mat2;

cout <<“eaqual to (10 is answer matrix)” << endl;

cin >> mat2;

mats[mat1] = mats[mat2];

}

if(com == “help”)

{

cout <<“Davids Woodfords matrix calculator” << endl;

cout << “takes the following commands” << endl;

cout <<” ‘dim’ :: allows you to dfine a matrix”<< endl;

cout <<” ‘rot’ :: roates a matrix through an agnle” << endl;

cout <<” ‘rlt’ :: reflects a matrix through the line y=tan(a) where a is given” << endl;

cout <<” ‘ans’ :: displays the answer to the last calculation” << endl;

cout <<” ‘mlt’ :: lets u multiply 2 matricies together” << endl;

cout <<” ‘dsp’ :: displays a matrix specified”<<endl;

cout <<” ‘let’ :: allows u to assign one matrix the value of another, eg answer”<<endl;

cout<<“===================================================================”<<endl;

cout <<“matricies are sotred in an array of 10, with numerical values starting at 0″<<endl;

cout<<“matrix 10 is the answer matrix”<<endl;

cout<<“any parameters will be asked for wen needed”<<endl;

}

}

}

int main()

{

cout << “Welcome to David Woodfords Matrix calculator” << endl << endl;

cout<<“type ‘help’ for a list of commands” <<endl;

// mat mata;

// mata.dimmat();

/* mat matb;

matb.dimmat();

mat matans;

matans = mult(mata, matb);

// mata.display();

*/

//rotate(mata, 30);

input();

return 0;

}

## Comments