内容:

设m*n的矩阵中有t个非零元素且t<<m*n,这样的矩阵成为稀疏矩阵,在存储稀疏矩阵时,按照常规方法存储时相当浪费内存,因此提出另外一种存储方法,即只存储非零元素,但在这类矩阵中,通常零元素的排列没有规律,为了能找到相应的元素,仅存储非零元素的值是不够的,还要记下它所在的行和列。于是采取如下办法:将非零元素所在的行、列以及它的值构成一个三元组(i,j,v),然后再按某种规律存储这些三元组,这种方法可以节约存储空间。编写程序用三元组表实现稀疏矩阵的按列转置操作。

步骤:

  1. 算法分析

本题需要利用三元组实现稀疏矩阵的按列转置操作。

何为转置操作?所谓矩阵转置,是指变换元素的位置,把位于(row,col)位置上的元素换到(col,row)位置上,也就是说,将元素的行、列互换。

采用三元组表压缩存储稀疏矩阵,实现矩阵的转置时,得到的转置矩阵的三元组表时要按一行一行存放且每行中的元素是按列号从小到大的规律顺序存放,因此在转换时,对a的每一列扫描三元组,找出相应的元素,若找到,则交换其行号与列号,并存储到b的三元组里。

程序中设置了三个函数:

  1. 函数InitSPNode()用来建立一个稀疏矩阵的三元组表。首先输入行数、列数和非零元素的值,输入(-1,-1,-1)结束输入。
  2. 函数showMatrix()用来输出稀疏矩阵。算法中按矩阵a的列进行循环处理,对a的每一列扫描三元组,找出相应的元素,若找到,则交换其行号和列号,并存储到矩阵b的三元组中。
  3. 函数TransposeSMatrix()用来完成稀疏矩阵的转置算法。算法的主要工作是在p和col的两重循环中完成,时间复杂度为O(n*t)。如果非零元素个数t和m*n同数量级,则算法的时间复杂度变为O(m*n^2)。

   2.概要设计

使用C语言,其中设置了以下函数

程序运行流程图如下:

3.测试

测试样例如下:

运行结果:

经测试运行无误。

经过不断的修改和调试,该算法已经基本能够满足要求,对于用户输入的稀疏矩阵,可以方便快捷的完成稀疏矩阵的转置。当非零元素的个数与m*n同数量级时,算法的时间复杂度为O(m*n^2),与传统存储方式下矩阵转置算法相比,节约了一定量的存储空间,但算法的时间性能更差一些,该算法的主要时间耗费在p和col的二重循环上,若能直接确定a中每一个三元组在b中的位置,则对a的三元组表扫描一次即可。算法程序还有待优化。

4.源码如下

#include <stdio.h>
#include <string.h>
#define OK 1
#define Maxsize 10 //用户自定义三元组最大长度
typedef struct { //定义三元组表int i,j;int v;
}SPNode;
typedef struct{ //定义三元组表SPNode data[Maxsize];int m,n,t;//矩阵行、列及三元表长度
}SPMatrix;
void InitSPNode(SPMatrix*a) { //输入三元组表int i,j,k,val,maxrow,maxcol;maxrow=0;maxcol=0;i=j=0;k=0;while(i!=-1&&j!=-1)//row=-1&&col=-1 结束输入{ printf(" 输入(行 列 值):  ");scanf(" %d %d %d",&i,&j,&val);a->data[k].i=i;a->data[k].j=j;a->data[k].v=val;if(maxrow<i) maxrow=i;if(maxcol<j) maxcol=j;k++;}a->m=maxrow;a->n=maxcol;a->t=k-1;
}
void showMatrix(SPMatrix *a) { //输出稀疏矩阵int p,q;int t=0;for(p=0; p<=a->m; p++) {for(q=0; q<=a->n; q++) {if(a->data[t].i==p&&a->data[t].j==q) {printf(" %d  ",a->data[t].v);t++;} else printf(" 0  ");}printf("\n"  );}
}
void TransposeSMatrix(SPMatrix *a,SPMatrix *b) { //稀疏矩阵转置int q,col,p;b->m=a->n;b->n=a->m;b->t=a->t;if(b->t) {q=0;for(col=0; col<=a->n; ++col) //按a的列序转置for(p=0; p<a->t; ++p) //扫描整个三元组表if(a->data[p].j==col) {b->data[q].i=a->data[p].j;b->data[q].j=a->data[p].i;b->data[q].v=a->data[p].v;++q;}}
}
int main() {SPMatrix a,b;printf("\n 结束请输入(-1 -1 -1)\n"  );InitSPNode(&a);printf(" 输入矩阵为:\n" );showMatrix(&a);//转置前TransposeSMatrix(&a,&b);printf(" 输出矩阵为: \n" );showMatrix(&b);//转置后
}

用三元组实现稀疏矩阵的转置相关推荐

  1. c语言三元组稀疏矩阵的转置实验报告,稀疏矩阵三元组实现矩阵转置算法实验报告.doc...

    稀疏矩阵三元组实现矩阵转置算法实验报告.doc 1实验三稀疏矩阵的三元组表示实现矩阵转置算法学院专业班学号姓名一.实习目的1掌握稀疏矩阵的三元组顺序表存储表示:2掌握稀疏矩阵三元组表示的传统转置算法的 ...

  2. c语言三元组稀疏矩阵的转置实验报告,稀疏矩阵快速转置 数据结构实验报告

    南昌航空大学实验报告 课程名称: 数据结构 实验名称: 实验五 稀疏矩阵的存储和快速转置 班 级: 学生姓名: 学号: 指导教师评定: 签 名: 题目:假设稀疏矩阵A采用三元组表表示,编写程序实现该矩 ...

  3. 用三元组存储稀疏矩阵并实现转置

    基本概念 在学习线性代数的时候,经常用到矩阵.在C语言中,表示矩阵的最直观形式就是二维数组.然而在实际应用中,很多高阶矩阵中的非零元素非常少,这个时候如果继续使用二维数组存储,那么就会浪费很多存储空间 ...

  4. 用三元组存储稀疏矩阵及其快速转置

    用三元组存储稀疏矩阵及其快速转置 稀疏矩阵的三元组存储方式 快速转置算法 代码 稀疏矩阵的三元组存储方式 稀疏矩阵可以用一个三元组数组表示,数组每个元素是一个三元组,三元组形式为 (矩阵行号,矩阵列号 ...

  5. 用三元组存储稀疏矩阵,实现其快速转置c语言代码,稀疏矩阵三元组表快速转置(C语言实现)...

    本来准备昨天下午写的,但是因为去参加360众测靶场的考核耽搁了,靶场的题目还是挺基础的. 继续学习吧. 使用黑色墨水在白纸上签名就像由像素点构成的稀疏矩阵.如图4所示. 图4手写体签名 [问题]请将以 ...

  6. java三元组的快速转置_矩阵压缩——三元组以及矩阵快速转置程序实现

    一.问题描述 将一个稀疏矩阵,用三元组的方式压缩存储,然后实现其快速转置 二.实验源码 #include #include #define Size 100 typedef struct { int ...

  7. 稀疏矩阵的转置(矩阵转置和快速转置)

    实现矩阵的转置: 1.将矩阵的行列值相互转换. 2.将每个三元组中的i和j交换. 3.重排三元组之间的次序便可实现矩阵的转置. void TransposeSMatrix(TSMatrix M, TS ...

  8. 利用三元组对稀疏矩阵进行压缩存储并实现矩阵的转置运算

    我们假设在m*n的矩阵中,有t个元素不为0,令a=t/(m*n),称a为矩阵的稀疏因子,通常认为a<=0.05时称为稀疏矩阵. 为了节省存储空间,我们对稀疏矩阵进行压缩存储--只存储稀疏矩阵的非 ...

  9. 稀疏矩阵的三元组存储及快速转置

    问题描述 [问题描述] 实现稀疏矩阵的三元组表存储和快速转置运算. [输入形式] 输入一个整型的6阶稀疏矩阵. [输出形式] 输出稀疏矩阵的三元组表形式,使用快速转置方法进行转置运算,输出辅助数组nu ...

最新文章

  1. ASP.Net2.0 数据绑定控件的优越性在哪里?
  2. MSSQL 如何采用sql语句 获取建表字段说明、字段备注、字段类型、字段长度
  3. STM32H743+CubeMX-双路FDCAN同时工作的终极方案(裸机)
  4. ASP.NET MVC view引入命名空间
  5. 基于HK-2000 OEM的嵌入式Linux开发
  6. 字符编码ASCII、ANSI、Unicode、UTF-8、GB2312
  7. [英语语法]词法之形容词
  8. 云呐|RFID资产盘点系统带审批(rfid库存盘点功能)
  9. 深度学习Course4第三周Detection Algorithms习题整理
  10. 下载测试视频网站分享
  11. php监听input,js实时监听input中值变化
  12. .doc文档无法设置默认打开方式
  13. 测试老鸟都在用的接口抓包常用工具以及接口测试工具都有哪些?
  14. linux设置系统时间戳
  15. 沐风:可怕的想什么就来什么
  16. 元器件封装生成工具LP Wizard
  17. android 齿轮动画,Android(Animation): 一直转个不停的齿轮
  18. 199美元的iPhone和磨刀霍霍的程序员
  19. 数据库(MySQL + Redis)
  20. 自定义Drawable:实现文字生成图片

热门文章

  1. makefile 的ifeq,filter,strip 简单使用
  2. UML基础、建模与设计实战笔记03第3、4章建模工具简介,常见uml建模工具,创建模块,创建类,用例图,参与者,用例,用例描述,用例之间的可视化表示,用例图建模技术及应用,进销存系统用例图
  3. 斯坦福开学演讲:不要在不断的优秀里走向平庸!
  4. C#之特性(Attribute)
  5. 怎样让代码显示开发人员或者作者信息?
  6. 20行代码爬取王者荣耀全英雄皮肤!让你享受白嫖的快乐!
  7. 第一张多米诺 微软黑屏来了
  8. leetcode104---求二叉树深度
  9. 互联网公司应该怎么发展猎头业务
  10. 2021年美容师(初级)作业考试题库及美容师(初级)操作证考试