本文共 2968 字,大约阅读时间需要 9 分钟。
创建 稀疏矩阵类 ,采用行主顺序把稀疏矩阵非0元素映射到一维数组中,提供操作:两个稀疏矩阵相加、两个稀疏矩阵相乘、输出矩阵。
键盘输入矩阵的行数、列数;并按行优先顺序输入矩阵的各元素值,建立矩阵; 对建立的矩阵执行相加、相乘的操作,输出操作的结果矩阵。 操作描述 为方便操作描述,我们假设存在一个矩阵P,下列各操作实际为对矩阵P的操作。 重置矩阵: 1 矩阵的行数n 矩阵的列数m [n行m列 表示矩阵中的所有元素] 即重置矩阵P的尺寸为n行m列,且随后按行优先顺序输入矩阵P的各个元素。 矩阵乘法: 2 矩阵的行数 矩阵的列数 [n行m列 表示矩阵中的所有元素] 设输入的矩阵为Q,若PxQ运算合法,则将PxQ的结果矩阵赋给P,若不合法,则将Q赋给P,同时输出-1。 矩阵加法: 3 矩阵的行数 矩阵的列数 [n行m列 表示矩阵中的所有元素] 设输入的矩阵为Q,若P+Q运算合法,则将P+Q的结果矩阵赋给P,若不合法,则将Q赋给P,同时输出-1。 输出操作: 4 设当前矩阵P的尺寸为n行m列,第一行输出矩阵P的行数和列数,随后n行按行优先顺序输出矩阵P,每行m个数字,来表示当前的矩阵内容,每行数字之间用空格分隔。 输入格式 第一行一个w(1<=w<=40)代表操作个数,接下来若干行是各个操作,其中保证第一个操作一定为重置矩阵。 输出格式 当执行操作4时,输出矩阵P;当执行操作2或3时,若对应运算不合法,则输出-1。 Sample Input 5 1 3 3 3 4 0 0 2 1 4 1 1 2 2 3 4 1 1 2 2 3 4 3 2 3 1 2 3 2 2 3 4 Sample Output -1 2 3 4 1 1 2 2 3 2 3 5 3 4 4 4 6 限制 矩阵的行数n与列数m一定为整数,且1<=n,m<=40。 1s, 64MB for each test case。#includeusing namespace std;const long long int maxsz=9999999;template struct triple{ int row,col; T value; triple& operator=(triple& x){ row=x.row; col=x.col; value=x.value; return *this; }};template class sparseMatrix{ private: int rows;//行 int cols;//列 int terms;//非零元素个数 triple * tArray;//用来存value的数组 public: ~sparseMatrix(){ delete[] tArray;};//析构函数 sparseMatrix(int &m,int &n);//构造函数 void change(int m,int n); void sparseMatrix1(sparseMatrix& a);//复制函数 void input();//重置1 int multiply(sparseMatrix &b);//乘法2 int add(sparseMatrix &b);//加法3 void output();//输出4 };//构造函数 ,初始化 template sparseMatrix ::sparseMatrix(int &m,int &n){ rows=m;cols=n; terms=0; tArray=new triple [maxsz];}template void sparseMatrix ::change(int m,int n){ rows=m; cols=n; }template void sparseMatrix ::sparseMatrix1(sparseMatrix& a){ rows=a.rows; //赋值矩阵的性质 cols=a.cols; terms=a.terms; for(int i=0;i void sparseMatrix ::input(){ T elem;terms=0; for(int i=0;i >elem; if(elem!=0){ tArray[terms].value=elem; tArray[terms].col=i-(i/cols)*cols+1; tArray[terms].row=i/cols+1; terms++; } } /*if(terms==0){ tArray[terms].row=1; tArray[terms].col=1; tArray[terms].value=0; terms=1; }*/ }//乘法template int sparseMatrix ::multiply(sparseMatrix &b){ if(cols!=b.rows){ sparseMatrix1(b); return -1; } else{ sparseMatrix c(rows,b.cols); T* tag=new T[b.cols+1]; for(int i=0;i int sparseMatrix ::add(sparseMatrix & b){ if(rows!=b.rows || cols !=b.cols) { sparseMatrix1(b); return -1; } else{ //设置结果矩阵的特征 sparseMatrix c(rows,cols); int it=0,ib=0; while(it!=terms && ib !=b.terms){ int tIndex=(tArray[it]).row*cols+(tArray[it]).col; int bIndex=b.tArray[ib].row*cols+(b.tArray[ib]).col; if(tIndex void sparseMatrix ::output(){ int k=0; cout< <<" "< <
这里矩阵乘法按照列计算的,若要降低算法的复杂度,乘法需要改变为按行计算,也即是被乘数的行。
转载地址:http://cfwzi.baihongyu.com/