C++实现重载矩阵的部分运算符
青空を越えて 人气:0前言
博主本人为C++菜鸟一只,本篇博客也是第一次写,主要目的用于自己mark,如有错误欢迎指出
本博客代码为我做C++实验时的代码,由于自己是菜鸟,所以代码内容掌握的也不是很熟。
在此记下此篇,待到日后查看也是属于自己青春的一部分吧。
正文
整个工程分为头文件,source,以及main构成。
工程的目的为实现对矩阵运算符‘+’,‘-’,‘*’,‘==’,‘!=’,‘<<’和‘>>’的重载,并在main中测试其情况。
以下为头文件
//Matrix.h #ifndef MATRIX_H #define MATRIX_H #include <iostream> using namespace std; class Matrix { public: Matrix operator + (Matrix&a);//重载 + Matrix operator - (Matrix&b);//重载 - Matrix operator * (Matrix&c);//重载 * bool operator == (Matrix&d);//重载 == bool operator != (Matrix&e);//重载 != friend ostream& operator << (ostream&,Matrix&);//重载 << friend istream& operator>>(istream&,Matrix&);//重载 >> void setMatrix(int a, int b);//设置矩阵行列 private: int row; int col; int matrix[200][200]; }; #endif
关于 void setMatrix(int a, int b); 其实这个函数可以不设置,利用构造函数可以完成该功能,甚至更完美。但我有些小懒,就不想去修改了,如果出事的话…QAQ还是希望不会出事吧。
还有就是,矩阵我设置成了200*200,其实可以利用new调用动态内存来更好的实现,但由于我太菜,不想去用二重指针,故放弃了这个方案。
以下为cpp文件
//Matrix.cpp #include <iostream> #include "Matrix.h" using namespace std; void Matrix::setMatrix(int a, int b)//构造函数可以取代这个 { row=a; col=b; } Matrix Matrix::operator + (Matrix &a)//重载 + { if (row!=a.row||col!=a.col) { throw"这两个矩阵不可相加"; }
抛出异常,之所以使用这个,是因为没法cout<<“错误”;之后return 0强制退出,因为返回类型是矩阵,我当时没有尝试利用exit()函数…(果然我太菜了QAQ)
else//矩阵元素相加 { Matrix sum;//创建新矩阵,为接下来返回矩阵用 sum.row=row; sum.col=col; for(int i=0; i<sum.row; i++) { for(int j=0; j<sum.col; j++) { sum.matrix[i][j]=matrix[i][j]+a.matrix[i][j];//矩阵加法计算规则 } } return sum;//返回值为sum矩阵 } }
计算规则需要自己确定(代几应该都学过),如这个是加法,规则如上:sum矩阵的各位置元素分别为’+‘前矩阵和’+'后矩阵对应位置元素的和。
Matrix Matrix::operator-(Matrix &b)//重载 - { if (row!=b.row||col!=b.col) { throw"这两个矩阵不可相减!";//抛出异常 } else//矩阵元素相减 { Matrix reduce; reduce.row=row; reduce.col=col; for(int i=0; i<reduce.row; i++) { for(int j=0; j<reduce.col; j++) { reduce.matrix[i][j]=matrix[i][j]-b.matrix[i][j];//减法规则 } } return reduce; } }
减法和加法类似,可以模仿着加法来,注意下计算规则就行
Matrix Matrix::operator*(Matrix&c) { if (col!=c.row) { throw"这两个矩阵不可相乘!"; } else//矩阵元素相乘 { Matrix multi; multi.row=row;//新矩阵的行等于第一个矩阵的行 multi.col=c.col;//新矩阵的列等于第二关矩阵的列 for(int i=0; i<multi.row; i++) { for(int j=0; j<multi.col; j++)//为新矩阵元素赋值时注意新矩阵元素个数 { multi.matrix[i][j]=0;//初始化新矩阵元素为0,为后面递加做准备 for(int k=0; k<col; k++) { multi.matrix[i][j]+=matrix[i][k]*c.matrix[k][j];//乘法计算规则 } } } return multi; } }
关于矩阵乘法的规则可以拿张纸先演算一下,这样方便自己理解。
bool Matrix::operator == (Matrix&d)//判断矩阵是否相等 { if (row!=d.row||col!=d.col)//先判断行列是否相等 { return false; } for(int i=0; i<row; i++)//再判断元素是否相等,只要有一个不等,立刻返回false { for(int j=0; j<col; j++) { if(matrix[i][j]!=d.matrix[i][j]) { return false; } } } return true; } bool Matrix::operator != (Matrix&e)//判断矩阵是否不等 { if (row!=e.row||col!=e.col) { return true;//原理同上,注意返回相反值 } for(int i=0; i<row; i++)//原理同上,注意返回相反值 { for(int j=0; j<col; j++) { if(matrix[i][j]!=e.matrix[i][j]) { return true; } } } return false; } ostream& operator << (ostream &out,Matrix& mat)//重载输出矩阵 { for (int i = 0; i < mat.row; i++) { for (int j = 0; j < mat.col; j++) { out << mat.matrix[i][j];//将矩阵元素输出,注意矩阵元素的间距 if (j == mat.col - 1) out << endl; else out << " "; } } return out;//返回输出流 } istream& operator>>(istream&in, Matrix &mat)//重载输入矩阵 { for (int i = 0; i < mat.row; i++) { for (int j = 0; j < mat.col; j++) { in >> mat.matrix[i][j];//由行到列一次输入元素 } } return in;//返回输入流 }
以下为main.cpp,主要用于测试。
//main.cpp #include <iostream> #include "Matrix.h" using namespace std; int main() { int row, col; Matrix A; cout<<"Please input rows cols:\n"; cin>>row>>col;//输入行列 A.setMatrix(row,col);//为矩阵设置行列 cout<<"Please input your matrix elements:\n"; cin>>A;//输入元素,因为已经重载了>>,所以可以直接在>>后面加矩阵类A cout<<"以下是你创建的第一个矩阵!\n"; cout<<A<<endl;//输出元素,因为已经重载了<<,所以可以直接在<<后面加矩阵类A Matrix B;//另一个矩阵 cout<<"Please input another one's rows cols:\n"; cin>>row>>col; B.setMatrix(row,col); cout<<"Please input your matrix elements:\n"; cin>>B; cout<<"以下是你创建的第二个矩阵!\n"; cout<<B<<endl; try//这是和throw,catch配合使用的关键字。具体使用可以谷歌或者百度 { Matrix sum=A+B; cout<<"两个矩阵相加为:\n"; cout<<sum<<endl; } catch (const char* msg)//如果throw抛出了异常,会(根据情况)捕获异常 { cerr<< msg << endl;//打印异常语句 } try { Matrix reduce=A-B; cout<<"两个矩阵相减为:\n"; cout<<reduce<<endl; } catch (const char* msg) { cerr<< msg << endl; } try { Matrix multi=A*B; cout<<"两个矩阵相乘为:\n"; cout<<multi<<endl; } catch (const char* msg) { cerr<< msg << endl; } if(A==B)//测试 == 是否重载成功 cout<<"两个矩阵相等!( == 为真测试通过!)"<<endl; else cout<<"两个矩阵不相等!( == 为假测试通过!)"<<endl; if(A!=B)// 测试 !=是否重载成功 cout<<"矩阵不相等!( != 为真测试通过!)"<<endl; else cout<<"矩阵相等!( != 为假测试通过!)"<<endl; return 0; }
运行结果
矩阵相乘:
矩阵相加减:
加载全部内容