博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构实验5
阅读量:3950 次
发布时间:2019-05-24

本文共 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。

#include
using 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<
<<" "<
<
sm(m,n); cin>>w; for(int i=0;i
>x; if(x==1)//输入 { cin>>m>>n; sm.change(m,n); sm.input();} else if(x==2)//乘法 { cin>>m>>n; sparseMatrix
a(m,n); a.input(); deci=sm.multiply(a); if(deci==-1) cout<
<
>m>>n; sparseMatrix
b(m,n); b.input(); deci=sm.add(b); if(deci==-1) cout<
<

这里矩阵乘法按照列计算的,若要降低算法的复杂度,乘法需要改变为按行计算,也即是被乘数的行。

转载地址:http://cfwzi.baihongyu.com/

你可能感兴趣的文章
通过等待键盘输入让程序等待外部条件改变
查看>>
通过限制循环次数来避免死循环
查看>>
ADO连接字符串
查看>>
字符数组的位置决定程序能否成功执行--不明白
查看>>
拷贝代码时没有仔细检查,导致误修改了函数参数
查看>>
MySQL批量导入数据SQL语句(CSV数据文件格式)
查看>>
ADO连接Oracle
查看>>
遍历Windows系统中所有进程的名字(*.exe)
查看>>
进程看门狗
查看>>
线程看门狗
查看>>
调试代码的宏定义
查看>>
创建、重命名文件
查看>>
文件大小保护
查看>>
删除指定目录下所有文件及目录
查看>>
XDR-从文件空间解码整数
查看>>
XDR-.x文件的简单使用
查看>>
XDR-枚举的试用
查看>>
使用CppSQLite3访问SQLite数据库
查看>>
第一个boost程序---timer的使用
查看>>
使用boost asio库实现字节数可控的CS通信
查看>>