【数据结构】稀疏矩阵乘法

1.传统矩阵相乘的算法使用三个嵌套循环实现,算法复杂度为O(m * n1 * n2)
2.使用三元组顺序表存储稀疏矩阵时,实现 Q= M * N,对于M中M(i,j)元素来说,只需要与N中第j行元素N(j,q)相乘,再存入Q(i,q)中。为了实现这一操作,增加一个向量rpos,表示每一行的第一个非零元在三元组中的位置,rpos作用相当于快速转置中的cpot向量。
这种结构叫做 行链接的顺序表

typedef struct {Triple data[MAXSIZE + 1]; //非零三元组表,data0未用int rpos[MAXRC + 1];    //各行第一个非零元的位置表int mu, nu, tu;           //三元组行数,列数,非零元素值
}RLSMatrix;

在创建矩阵时,需要求得矩阵的rpos向量,求法与cpot一致。

Status CreateRLSMatrix(RLSMatrix &M) {cout << "输入矩阵行数,列数,非零元素个数:" << endl;cin >> M.mu >> M.nu >> M.tu;cout << "依次输入" << M.tu << "个元素的行数,列数,元素值:" << endl;for (int i = 1; i <= M.tu; i++){cin >> M.data[i].i >> M.data[i].j >> M.data[i].e;}int* num = (int*)malloc(M.mu * sizeof(int));int arow;int q;if (M.tu) {for ( arow = 1; arow <= M.mu; ++arow) num[arow] = 0;for (int t = 1; t <= M.tu; ++t) ++num[M.data[t].i];//求M中每一行含非零元个数M.rpos[1] = 1;//求第col列中第一个非零元在b.data 中的序号for (arow = 2; arow <= M.mu; ++arow)M.rpos[arow] = M.rpos[arow - 1] + num[arow - 1];}cout << "矩阵构造完成" << endl;return OK;
}

稀疏矩阵乘法
算法思路:
大循环是对M中的每一行进行。
rpos向量用来确定每行元素个数
再对该行每个元素M(i,j)进行处理,找到N中对应的第 j 行,将这一行所有元素与M(i,j)相乘,结果存入ctemp累加器中,该行元素都处理完成后,ctemp中所存储的便是Q中第 i 行数据

Status MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix &Q) {//求稀疏矩阵乘积 Q = M x N  采用行逻辑链接存储表示if (M.nu != N.mu)return ERROR;Q.mu = M.mu; Q.nu = N.nu; Q.tu = 0;int arow,tp,p,brow,t,q,ccol;int* ctemp = (int*)malloc((M.mu+1) * sizeof(int));if (M.tu * N.tu != 0) {for (arow = 1; arow <= M.mu; ++arow) {//对M的每行进行处理for (int i = 0; i <= M.mu; i++)ctemp[i] = 0;//累加器清零Q.rpos[arow] = Q.tu + 1;if (arow < M.mu)tp = M.rpos[arow + 1];else tp = M.tu + 1;//确定M中该行元素个数for ( p = M.rpos[arow]; p < tp; p++){//M中对该行的每个元素进行处理brow = M.data[p].j;if (brow < N.mu) t = N.rpos[brow + 1];else t = N.tu + 1;for (q = N.rpos[brow]; q < t; ++q) {//将该元素与矩阵N中对应行的元素进行相乘,结果存入累加器ccol = N.data[q].j;ctemp[ccol] += M.data[p].e *N.data[q].e;}}for(ccol =1;ccol<=Q.nu;++ccol)if (ctemp[ccol]) {//第arow行处理完毕,将累加器中值存入Q中if (++Q.tu > MAXSIZE)return ERROR;Q.data[Q.tu] = { arow, ccol, ctemp[ccol] };}//if}//for arow}//if
}

该算法总的时间复杂度为O(M.mu * N.nu + M.tu * N.tu/N.mu)
ctemp初始化 O(M.mu * N.nu)
求Q中所有非零元 O(M.tu * N.tu / N.mu)
压缩存储 O(M.mu * N.nu)

数据结构 稀疏矩阵乘法相关推荐

  1. 稀疏矩阵 c语言,C语言数据结构 稀疏矩阵

    <C语言数据结构 稀疏矩阵>由会员分享,可在线阅读,更多相关<C语言数据结构 稀疏矩阵(4页珍藏版)>请在人人文库网上搜索. 1.实验十 稀疏矩阵#include #defin ...

  2. cuda编程:稀疏矩阵乘法结合MINRES算法求解泊松方程的并行编程

    可以通过本人知乎免费了解博客内容和代码质量添加链接描述 稀疏矩阵的介绍和存储 稀疏矩阵主要指的是存在大量零元素的矩阵,常见的稀疏矩阵比如说社交媒体的邻接矩阵,微分方程数值解钟差分法形成的矩阵和有限元方 ...

  3. noj数据结构稀疏矩阵的加法十字链表_数据结构学习(C )稀疏矩阵(十字链表1)

    CSDN 先说说什么叫稀疏矩阵. 你说, 这个问题很简单吗, 那你一定不知道中国学术界的嘴皮子仗, 对一个字眼的"抠"将会导致两种相反的结论.这是清华 2000 年的一道考研题:& ...

  4. noj数据结构稀疏矩阵的加法十字链表_一个算法毁了一款好游戏?算法和数据结构到底有多重要?...

    来源 | 异步 | 文末赠书 前段时间大火的国产游戏--<太吾绘卷>,由于创新的玩法和精良的制作一度广受好评,然而随着玩家游戏的深入和时长的积累,发现该游戏在玩的过程中游戏外的问题很多很多 ...

  5. 数据结构 稀疏矩阵三元组顺序表 基本操作

    [数据结构]稀疏矩阵 三元组顺序表存储 基本操作 1.稀疏矩阵定义: 假设在 mn 的矩阵中,又t个元素不为零.δ = t/mn ,称δ为矩阵的稀疏因子,通常定义δ小于等于0.05时称为稀疏矩阵. 2 ...

  6. 数据结构 稀疏矩阵的实现方法

    稀疏矩阵的实现 什么是稀疏矩阵,怎么定义才是稀疏矩阵?假设在m x n的矩阵中,有t个不为0的元素.令z=t/(m x n),若z<=0.05则称此矩阵为稀疏矩阵.由于稀疏矩阵的非0元素较少,所 ...

  7. 数据结构--稀疏矩阵的一种实现

    package mainimport ("encoding/json""fmt""os" )//定义一个结构体保存原始矩阵的信息 type ...

  8. c++矩阵转置_C语言:数据结构-稀疏矩阵的压缩存储

    (1)稀疏矩阵的特点 在一个m×n的矩阵中,设矩阵中有i个元素不为零,并令△=i/(m×n),称△为稀疏因子.通常当△≤0.05时.认为该矩阵为稀疏矩阵. 对这类矩阵实现压缩存储的基本思路是只需要存储 ...

  9. 数据结构稀疏矩阵的加法十字链表_学习数据结构和算法的框架思维

    ----------- 通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友.由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜.我这 ...

最新文章

  1. common lisp里的几个操作符
  2. hi3516a的文件系统错误
  3. 刚刚,华为重磅宣布:无人驾驶正式上高速!
  4. Java中的JSON
  5. 【设计模式】代理模式 ( 静态代理 )
  6. Solr分页与高亮(使用SolrNet实现)
  7. Xcode Cocoa程序MessageBox 弹框
  8. python羊车门_羊车门 python 作业
  9. 【燕郊】【2015-12-31】【知乎】
  10. 读取properties文件方式
  11. macbook pro python开发_年轻人第一台 Mac,来自一个开发者的 Macbook Pro 2019 16寸简评...
  12. FastFel解析一个公式的步骤
  13. cocosbuilder3.0使用小记
  14. 设计模式之软件设计原则
  15. 关于网站icon小图标在网站上不显示的问题解决办法
  16. Python+bs4实现爬取小说并下载到本地
  17. 【pyplot】scatter根据点的label或位置设置不同颜色
  18. HttpMessageNotReadableException: Required request body is missing:
  19. android实现蓝牙耳机的连接及列表的管理
  20. 网站地图是什么?该如何生成

热门文章

  1. 科学计算基础软件包NumPy入门讲座(7):矩阵
  2. 营销法则之AIDMA|AISAS
  3. 【数据分析】业务分析常见漏斗模型
  4. 程序员称子弹短信存在抄袭,罗永浩回复:感谢知乎蠢萌科学家们!
  5. Mac OS Catalina系统文件无法删除问题
  6. python-day31(正式学习)
  7. WAR3 天地劫技能节选002
  8. PHP怎么做QQ个性标签,可爱简单的个性签名 qq标签大全
  9. Oracle 多表查询与集合运算
  10. 1074. Reversing Linked List 解析