系列文章目录

文章目录

  • 系列文章目录
  • 前言
  • 一、题目描述
  • 二、c++代码
  • 总结

前言

《数据结构基础》c语言版 第2版,Ellis Horowitz著,朱仲涛译
1.3节,page64,程序2.10

一、题目描述

稀疏矩阵相乘

二、c++代码

代码如下:

#include<iostream>
using namespace std;struct term {int row;           //行,下标为0时指矩阵的行数int col;           //列,下标为0时指矩阵的列数int value;         //数值,下标为0时指矩阵的非零元素数
};termA[100] = { {3,4,6},{0,0,1},{0,2,2},{1,1,3},{1,3,4},{2,0,5},{2,2,6} },B[100] = { {4,3,4},{0,0,1},{1,1,1},{2,2,1},{3,0,1} };//插入元素到积矩阵
void storesum ( term d[ ], int *t, int row, int col, int *sum) {if( *sum ) {d[++*t].row = row;d[*t].col = col;d[*t].value = *sum;*sum = 0;}
}int compare(int a,int b)
{if(a > b)return 1;else if (a < b)return -1;elsereturn 0;
}//矩阵转置, x转置后得到new_b
void fast_transpose ( term x[ ], term new_b[ ] ) { //int start_pos[10];                 //转置后各行起始位置int row_terms[10];             //转置后的每行中非零元素的个数new_b[0].row = x[0].col;new_b[0].col = x[0].row;new_b[0].value = x[0].value;if( x[0].value > 0 ) {for( int i = 0; i < x[0].col; i++ )row_terms[i] = 0;for( int i = 1; i <= x[0].value; i++ )row_terms[x[i].col]++;start_pos[0] = 1;for( int i = 1; i < x[0].col; i++ )start_pos[i] = start_pos[i-1] + row_terms[i-1];for( int i = 1; i <= x[0].value; i++ ) {int j = start_pos[x[i].col];new_b[j].row = x[i].col;new_b[j].col = x[i].row;new_b[j].value = x[i].value;start_pos[x[i].col]++;}}
}//矩阵a乘于矩阵b得到矩阵d;
void mmult ( term a[ ], term b[ ], term d[ ] ) {term new_b[100];fast_transpose ( b, new_b );   //转置第二个矩阵int sum = 0;int t = 0;                     //d总的元素个数//下面几行只是为了第二个for循环多循环一次,以致得到最后的那个结果new_b[b[0].value+1].row = b[0].col;new_b[b[0].value+1].col = 0;new_b[b[0].value+1].value = 0;a[a[0].value+1].row = a[0].row;for( int i = 1; i <= a[0].value; ) {int row = a[i].row;int column = new_b[1].row;int row_begin = i;      //记录当前行最前的非零元素的位置for(int j = 1; j <= b[0].value+1; ) {if( a[i].row != row ) {   //检查a矩阵当前行是否还有元素,如果没有 证明当前行非零元素已经遍历完,可以将结果存到d矩阵了storesum ( d, &t, row, column, &sum );i = row_begin;     //行中第一个非0数for( ; new_b[j].row == column; j++ ); //a中的当前行非零元素已经没有的,而b中还有column = new_b[j].row; //指向下一个(下一列那个)元素} else if( new_b[j].row != column ) {  //检查b矩阵当前列是否还有元素,如果没有 证明当前列非零元素已经遍历完,可以将结果存到d矩阵了storesum ( d, &t, row, column, &sum );i = row_begin;//a矩阵回到当前行的最前面一个非零元素,以致与new_b的下一行相乘column = new_b[j].row;//指向一个(下一列那个)元素} else {switch (compare(a[i].col,new_b[j].col)) {  //检查a的列是不是等于b的行case -1:i++;break;case 1:j++;break;case 0:sum+=(a[i].value*new_b[j].value);i++;j++;break;}}}for( ; a[i].row == row; i++ );//b中的当前行非零元素已经没有的,而a中还有;}d[0].row = a[0].row;  //行数d[0].col = b[0].col;  //列数d[0].value = t;       //非零元素数目
}
int main() {term d[100];          //积mmult( A, B, d );for(int i=0; i<=d[0].value; i++)cout<<d[i].row<<' '<<d[i].col<<' '<<d[i].value<<endl;cout<<endl;return 0;
}

总结

添加链接描述

添加链接描述

稀疏矩阵相乘mmult相关推荐

  1. S3c6410linux下DMA驱动

    DMA 谨以此文纪念过往的岁月. DMA传输支持4种格式,内存到内存,设备到内存,内存到设备,设备到设备. 对于内存到内存比较好理解,就是不通过CPU的复制,直接使用进行数据传输. 1.dma的初始化 ...

  2. 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能

    比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能 对于机器学习的很多问题来说,计算的瓶颈往往在于大规模以及频繁的矩阵运算,主要在于以下两方面: (Dense/Sparse) Matr ...

  3. _DataStructure_C_Impl:稀疏矩阵三元组

    #include<stdlib.h> #include<stdio.h>#define MaxSize 200 typedef int DataType; typedef st ...

  4. 稀疏矩阵(三元组顺序表存储)6种操作的实现

    /* *任务描述:针对稀疏矩阵,实现10个基本操作 * 1:建立稀疏矩阵 : * 2:输出稀疏矩阵 : * 3:转置稀疏矩阵 : * 4:稀疏矩阵相加 : * 5:稀疏矩阵相减: * 6:稀疏矩阵相乘 ...

  5. [C++]稀疏矩阵(一维数组描述)

    操作: 重载赋值.输入.输出运算符: 稀疏矩阵加法.乘法.转置. 代码: #include<iostream> #include<vector> using namespace ...

  6. Jquery各版本下载,附Jquery官网下载方法

    查看全文 http://www.taodudu.cc/news/show-92745.html 相关文章: [工具软件]webstorm的实用快捷操作(持续积累) [jQuery]jQuery知识点梳 ...

  7. 【win】黑框中常用的命令

    查看全文 http://www.taodudu.cc/news/show-92749.html 相关文章: [基础知识]如何快速转发CSDN博客 [java]将自己写的类生成说明文档的方法 [基础知识 ...

  8. 【数据结构】数组和广义表

    感觉数组这一段没讲什么太多的东西. 先是讲了下定义,就是每个维度上都有对应的前驱后继,首尾元素例外.操作只有初始化 销毁 取元素 修改元素.然后讲了下适合用顺序存储结构,多维情况下根据下标(j1 j2 ...

  9. AI:IPPR的数学表示-CNN稀疏结构进化(Mobile、xception、Shuffle、SE、Dilated、Deformable)

    接上一篇:AI:IPPR的数学表示-CNN基础结构进化(Alex.ZF.Inception.Res.InceptionRes). 抄自于各个博客,有大量修改,如有疑问,请移步各个原文.....17年的 ...

最新文章

  1. Depth Bias
  2. 如何添加QQ 微信等程序到右键打开
  3. 50.什么是内部碎片?什么是外部碎片?
  4. python连接mysql代码_python连接mysql
  5. xiaocms php,XiaoCms PHP企业网站模板, ,后台可备份 WEB(ASP,PHP,...) 238万源代码下载- www.pudn.com...
  6. Failed to capture snapshot of output files for task ' :packagePreDebug' property ''outputDirectory'
  7. Python yaml处理
  8. 修改oracle内存大小
  9. 第二阶段团队冲刺(六)
  10. 自动驾驶 6-2: 几何横向控制Lesson 2: Geometric Lateral Control - Pure Pursuit
  11. 200套IT电子类数码产品行业响应式html5模板电器销售企业网站模板服装服饰购物电商网站模板鞋子电子商务html网站模板html5网页静态模板Bootstrap扁平化网站源码css3手机seo自适响
  12. swfupload ajax,swfupload ajax无刷新上传图片实例代码
  13. CentOS 6.4 安装D-Link 525(RT5360)无线网卡驱动
  14. 转载:技术大停滞——范式春梦中的地球工业文明8 反思与总结
  15. Windows10数据线连接坚果手机SmartisanTNT
  16. 面向端到端的情感对话生成研究综述
  17. windows共享文件创建----局域网办公
  18. EMC常见术语-dB、dBm、dBw以及如何计算
  19. 山东财经大学python实验六答案_金融学(山东财经大学)智慧树知道2020章节测验答案...
  20. 计算机光驱故障分析,光驱故障分析与维修实例

热门文章

  1. Python函数引用
  2. java检测工具_常用Java代码质量检测评估工具
  3. 无人机生态环境监测、图像处理与GIS数据分析综合实践技术应用
  4. 利用python建立股票量化交易系统(一)——小市值选股票模型
  5. 基于s7—1200的电梯控制,wincc hmi动画仿真,带PLC源代码
  6. 从现在开始,我要……
  7. 逻辑回归模型在R中实践
  8. c语言求平均数double,编写程序以计算浮点值的平均值
  9. 定了!2021年PMP考试时间安排
  10. 建模算法笔记 | 拟合算法