欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    稀疏矩阵相乘.docx

    • 资源ID:7225161       资源大小:95.10KB        全文页数:19页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    稀疏矩阵相乘.docx

    1、稀疏矩阵相乘 稀疏矩阵相乘1问题描述稀疏矩阵的三元组及十字链表表示(1)稀疏矩阵及其三元组表示行(row)列(col)值(value)00322106152111131517423-6535396403975228 稀疏矩阵 (2)稀疏矩阵的十字链表表示基本要求(1)以“带行逻辑链接信息”的三元组表示稀疏矩阵;(2)输入矩阵用三元组顺序输入;(2)稀疏矩阵采用十字链表表示;(3)实现两个矩阵相乘的运算,而运算结果的矩阵则以通常的阵列形式列出。2设计思路存储结构设计三元组表示稀疏矩阵只存储矩阵中极少的非零元素,采用来唯一地确定每一个非零元素,其中row、col、value分别表示非零元素在矩阵中

    2、的的行下标、列下表和值。各数组元素的三元组按在原矩阵中的位置以行优先的顺序依次存放。struct triple /三元组结构定义 int row, col; /非零元素行号,列号 Float value; /非零元素的值 triple& operator=(triple &x) row=;col=;value=; 十字链表表示稀疏矩阵struct element int row,col;float value;class Matrix;class node / 矩阵节点类的定义 friend class Matrix;public: node():head(true) right=down=t

    3、his; /建立附加头结点 node(element *t) / 建立非零元素结点 =t-col; =t-row; =t-value; right=down=this; head=false; node*down,*right;/行列链表指针 bool head; union element triple;node*next; /无名联合;class Matrix/稀疏矩阵的类定义 friend istream&operator(istream&,Matrix&); friend ostream&operatorCol= Matrix C(this-Row,; /以A矩阵的行和b矩阵的列为行列

    4、建立稀疏矩阵 float value; node *Row_head,*Col_head; /设两个指针,一个充当行头指针,一个为列指针 for(int i=1;i=temp;i+) /先确定行,再求出C矩阵在该行各列的元素 for(int j=1;jright!=Locate(i) /假如行中还有元素不为零就找与之匹配的元素相 Row_head=Row_head-right; Col_head=Col_head-down; while(Row_head-!=Col_head- &Col_head-down!=(j) /假如行列不相等而且对应列还有元素,就继续找匹配的元素否则判断再环 if(R

    5、ow_head-Col_head- Col_head=Col_head-down; else if(Row_head-right=Locate(i) Col_head=Col_head-down;/假如b矩阵该列元素比a矩阵该行元素 else Row_head=Row_head-right; /则b中该列元素已经无法找到能相乘元素则往下推直至跳出循环 if(Col_head-down!=(j)|Col_head-=Row_head- value+=Row_head-*Col_head-;if(value!=0) (i,j,value) return C; else Matrix C; cerr

    6、输入的两个矩阵不符规则,不能相乘!endl; return C; 测试用例3调试分析调试过程(1)编译时程序中没有语法错误,但是格式及语句的书写错误叫多,按照编译错误提示一次改正错误,直至编译正确。(2)运行程序。以三元组的形式,即输入矩阵的行数、列数、非零元素个数和各非零元素的行、列、值,输入两个稀疏矩阵,输出了两个矩阵及它们的乘积。(3)问题:输出的矩阵不符合要求,形成的阵列中只有非零元素,零元素都没有输出。说明友元输入函数有问题,将元函数改为下面的函数后能正确输出矩阵阵列。ostream &operator(ostream &out,Matrix &b) /输出函数 node *x; f

    7、or(int i=1;iright; for(int j=1;jhead=false&(x-=j) (4); out; x=x-right; else if(x-head=true) for(j;j=;j+)(4);cout0;break; else(4);cout0; coutendl; return out;设计分析(1)此程序中乘法算法的时间复杂度为O(Rows*Cols)。(2)此程序没有将类做成模版,导致只能输入floate型的值。 改进方案:将所有的类做成模版,将其属下的floate类型的全改为模版类型参数。(3)此程序显的很繁锁,算法比较复杂(4)此程序只有稀疏矩阵的乘法,可以加

    8、入其他的矩阵运算来完善运算,也可以再主程序中设计选择菜单,实现多种运算。(5)改进算法:重新考虑算法,看是否可用数组加指针的方式实现,用数组可以简化找头指针的繁琐过程,简化循环的过程提高程序运行效率!4经验与体会 我的题目是实现三元组,十字链表下乘法,运算。看到这个题目的时候,我一片茫然,因为我们数据结构这一部分并没有讲,我根本就不知道十字链表是什么。于是我赶紧看书,可是书上对十字链表的将就知识一笔带过,更不要指望在书上找到相关代码了。于是我先学习了三元组数组的乘法算法,在这个基础上,我在网上收集各种资料收集和算法。然后不断调试,不断改进程序,最终正确结果终于运行出来了。我觉得自己的数据结构学

    9、得不好,但是数据结构可以说是计算机里一门基础课程,对于以后的学习尤为重要。所以我们一定要把基础学扎实,这次的课内实践帮我重新巩固基础知识,也学了很多新知识,提高了我的专业的动手实践能力,也提高了我的对数据结构的学习兴趣。此次课程设计过程中,我真正的体验到,拿到一个问题,应该先分析,将其的属性,功能分析清楚后,再进行细化,考虑其实现的具体的、有效的算法,有了整体的结构框架后再上机!以前只要拿到题就直接打开电脑,想到什么就写什么,没整体思考,对小程序可以,大程序就会彻底崩溃。编程实质就是问题的分析及其实现的算法,这两方面解决了上机编程才会得心应手,剩下的就是按算法些代码了!确定一个好算法很难,一个

    10、人往往陷入死循环,思路受局限,找人讨论很必要,编程时团队意识很重要,这不是一个人就能搞定的。在实践的过程中我每天完成一小部分。尽量减少操作的盲目性,提高我们学习的效率。有个总体的大纲来逐步实现。我也曾经犯过这种错误。每个函数都做出来部分,结果都没做完。所以我们要养成有良好的时间规划的习惯,只有一步一步的进行,我们才能完成得更好。同时在实验中我们要培养自己独立的思考能力和解决问题的能力,不能太过依赖于同学和网络,我们应该要有自己的想法,培养自己的编程思维。实践能力对我们今后的发展也是至关重要的,我们只有拥有很好地实践能力,才有机会再编程这个领域有所发展。子啊编程的过程中,我们应该积极的朝着更好地

    11、一面发展不断的完善程序,不能马马虎虎随便应付一下。 就像古人云,纸上得来终觉浅,得知此事要躬行。为了以后的计算机道路,我们应该不断的提高自身的专业素养。5附录程序#include#includestruct element int row,col;float value;class Matrix;class node / 矩阵节点类的定义 friend class Matrix;public: node():head(true) right=down=this; /建立附加头结点 node(element *t) / 建立非零元素结点 =t-col; =t-row; =t-value; rig

    12、ht=down=this; head=false; node*down,*right;/行列链表指针 bool head; union element triple;node*next; /无名联合;class Matrix/稀疏矩阵的类定义 friend istream&operator(istream&,Matrix&); friend ostream&operator=nm:n; node *current; headnode=new node(&x); current=headnode-right=new node(); for(int i=1;inext=new node(); cu

    13、rrent=current-next; Matrix:Matrix():Row(0),Col(0),Terms(0) /构造函数的实现 element x; =Row; =Col; =0;Matrix:Matrix(Matrix&T) /复制构造函数的实现 Init,; node*current; for(int i=1;iright!=(i) /通过行遍历逐个赋值 current=current-right; Insert(current-,current-,current-; void Matrix:Init(int m,int n) /矩阵初始化函数的实现 Row=m;Col=n;Ter

    14、ms=0; element x; =m;=n;=0; headnode=new node(&x); node *current; if(m0&n0) temp=m=nm:n; current=new node(); headnode-right=current; for(int i=1;inext=new node(); current=current-next; elsecout矩阵初始化错误!right; for(int k=1;knext; return current;void Matrix:Insert(int m,int n,float p)/插入函数的实现 element x;

    15、=m;=n;=p; if(mRow&nCol) node *Newnode=new node(&x),*current,*head; head=Locate(m);/先定位行的位置再寻找列插入 current=head-right; if(current=head) current-right=Newnode; Newnode-right=current; else while(current-right!=head) current=current-right; Newnode-right=current-right; current-right=Newnode; /完成插入 head=Lo

    16、cate(n); /先定位列再寻找行插入 current=head-down; if(current=head) current-down=Newnode; Newnode-down=current; else while(current-down!=head) current=current-down; Newnode-down=current-down; current-down=Newnode; Terms+; /完成插入 else cout输入的结点位置超出了范围,请重新输入!(istream &in,Matrix &b) /输入函数重载的实现 int M,N,m,n,T;float

    17、p; cout请输入矩阵的行列和非零元素个数:MNT; (M,N); if(T(M*N) cerr输入的元素个数超过范围endl; exit(1); else cout请输入各非零元素的行数列数和值endl; cout行数 列数 值endl; for(int i=1;i=T;i+) /输入元素结点并且插入矩阵 coutimnp; (m,n,p); /插入结点 return in; ostream &operator(ostream &out,Matrix &b) /输出函数重载 node *x; for(int i=1;iright; for(int j=1;jhead=false&(x-=j

    18、) (4); out; x=x-right; else if(x-head=true) for(j;j=;j+)(4);cout0; break; else(4);cout0; coutRow=; this-Col=; node *current; for(int i=1;iright!=current) current=current-right; /通过行遍历逐个赋值 this-Insert(current-,current-,current-; return *this;void Matrix:makeEmpty() /清空矩阵的实现 node*del,*current; for(int

    19、 i=1;idown!=Locate(i) del=current-down; /通过列的附加头结点向下删除结点 current-down=del-down; delete del; Matrix Matrix:Mul( Matrix b) /矩阵乘法的实现 if(this-Col= Matrix C(this-Row,; /以A矩阵的行和b矩阵的列为行列建立稀疏矩阵 float value; node *Row_head,*Col_head; /设两个指针,一个充当行头指针,一个为列指针 for(int i=1;i=temp;i+) /先确定行,再求出C矩阵在该行各列的元素 for(int j=1;jright!=Locate(i) /假如行中还有元素不为零就找与之匹配的元素相乘 Row_head=Row_head-right; Col_head=Col_head-down; while(Row_head-!=Col_head-&Col_head-down!=(j) /假如行列不相等而且对应列还有元素,就继续找匹配的元素否则判断再循环 if(Row_head-Col_head- Col_head=Col_head-down; else if(Row_head-right=Locate(i) Col_head=Col_head-down; /假如


    注意事项

    本文(稀疏矩阵相乘.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开