稀疏矩阵存储和转置

稀疏矩阵是矩阵中一种特别的矩阵,主要特点是:非零元素占矩阵所有元素的比例极少。那么,对于这种矩阵的存储,就存在很多很节省空间的方式,核心要点也就是舍弃那些无用元素即零元素,下面将以两种存储方式进行程序设计的实现:

关于稀疏矩阵的COO存储和CSR存储方式,以及不同存储方式的转置矩阵,使用C语言实现逻辑功能,稀疏矩阵二维阵列及行列长度均保存在input.bat文件中,文件见问末,详细代码如下:

使用C语言实现,通过VC++6.0开发工具实现。

// 完整代码
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"#define MAXSIZE 100       //最大非零元数
//COO格式
typedef struct Triple {     //三元组int i, j;               //行列下标float e;             //非零元元素值
}Triple;
typedef struct TSMatrix {       //矩阵Triple data[MAXSIZE + 1];   //三元组表int mu, nu, tu;             //矩阵的行列数、非零元个数
}TSMatrix;//CSR格式
typedef struct Tuple {     //二元组int j;               //列下标float e;             //非零元元素值
}Tuple;
typedef struct Dista {     //第一个非空字符距离 int l;               //长度
}Dista;
typedef struct CSRstorage {       //矩阵Tuple data[MAXSIZE + 1];   //二元组表,替代两个有关系的一维表Dista dist[MAXSIZE + 1];   //距离数组 int mu, nu, tu;             //矩阵的行列数、非零元个数
}CSRstorage;void main()
{//声明矩阵 TSMatrix M,Tr;//COOCSRstorage Xs,XsZ;//CSRint i,j,t;//打印学生学号和姓名printf("学号:2019xxx\t姓名:xxx\n"); //***************************************************************************//读取bat文件内容,并以COO格式存儲 //***************************************************************************int m,n;//长度和宽度float sp[15][15]; //自定义二维数组大小FILE *p1 = fopen("input.bat", "r");  //input.bat文件放在.c文件所在的文件夹中if (p1==NULL)  //检测是否成功打开{printf("Open failed\n");}//读取数组长度 fscanf(p1,"%d",&m);fscanf(p1,"%d",&n);M.mu = m;M.nu = n;//二维数读取矩阵值,并以COO格式存储 int temp = 0;for (i = 0; i<15; i++){for (j = 0; j<15; j++){fscanf(p1, "%f", &sp[i][j]);   //读入input.bat数据给数组spif(!(sp[i][j]<0.000001&&sp[i][j]>-0.000001)){M.data[temp].i = i;M.data[temp].j = j;M.data[temp].e = sp[i][j];temp = temp + 1;}}}M.tu = temp;fclose(p1);//释放指针//***************************************************************************//打印三个向量,非零//***************************************************************************printf("COO,打印三个向量如下:\n");printf("(%d,%d,%g)\t",M.data[0].i,M.data[0].j,M.data[0].e);printf("(%d,%d,%g)\t",M.data[1].i,M.data[1].j,M.data[1].e);printf("(%d,%d,%g)\n",M.data[2].i,M.data[2].j,M.data[2].e);//***************************************************************************//打印原始矩阵 //***************************************************************************printf("COO,打印原始矩阵如下:\n"); for (i = 0; i<M.mu; i++){for (j = 0; j<M.nu; j++){int bs = 0;for(t = 0;t<M.tu;t++){if(i == M.data[t].i && j == M.data[t].j){printf("%g\t",M.data[t].e);bs = 1;break;}}if(bs == 0){printf("0\t");}}putchar('\n');//每行结束换行}//***************************************************************************//矩阵转置//***************************************************************************Tr.mu = M.nu;Tr.nu = M.mu;Tr.tu = M.tu;for(t = 0;t<M.tu;t++){Tr.data[t].i = M.data[t].j;Tr.data[t].j = M.data[t].i;Tr.data[t].e = M.data[t].e;}//***************************************************************************//打印转置矩阵 //***************************************************************************printf("COO,打印转置矩阵如下:\n");for (i = 0; i<Tr.mu; i++){for (j = 0; j<Tr.nu; j++){int bs = 0;for(t = 0;t<Tr.tu;t++){if(i == Tr.data[t].i && j == Tr.data[t].j){printf("%g\t",Tr.data[t].e);bs = 1;break;}}if(bs == 0){printf("0\t");}}putchar('\n');//每行结束换行}//***************************************************************************//以 CSR格式存儲 Xs//***************************************************************************Xs.mu = m;Xs.nu = n;int num = 0;for (i = 0; i<m; i++){Xs.dist[i].l = num;for (j = 0; j<n; j++){if(!(sp[i][j]<0.000001&&sp[i][j]>-0.000001)){Xs.data[num].j = j;Xs.data[num].e = sp[i][j];num = num + 1;}}}Xs.dist[m].l = num;Xs.tu = num;//***************************************************************************//打印三個向量 //***************************************************************************//方式一,先计算出三个,再打印//方式二,一直打印,累计三个printf("CSR,打印三个向量:\n");int js = 0;for(i=1;i<=m;i++){if(js>=3){break;}for(j=0;j<Xs.dist[i].l-Xs.dist[i-1].l;j++){if(js>=3){break;}printf("(%d,%d,%g)\t",Xs.dist[i-1].l,Xs.data[Xs.dist[i-1].l+j].j,Xs.data[Xs.dist[i-1].l+j].e);js = js + 1;}}//***************************************************************************//打印原始矩陣 //***************************************************************************printf("\nCSR,打印原始矩阵如下:\n"); for (i = 0; i<Xs.mu; i++){if(Xs.dist[i+1].l-Xs.dist[i].l>0){for(j = 0; j<Xs.nu; j++){int bs = 0;for(t = Xs.dist[i].l;t<Xs.dist[i+1].l;t++){if(j == Xs.data[t].j){printf("%g\t",Xs.data[t].e);bs = 1;break;}}if(bs == 0){printf("0\t");}} } else {for(j = 0; j<Xs.nu; j++){printf("0\t");}}putchar('\n');//每行结束换行}//***************************************************************************//矩陣转置 XsZ//***************************************************************************XsZ.mu = Xs.nu;XsZ.nu = Xs.mu;XsZ.tu = Xs.tu;int Znum = 0;for(i=0;i<XsZ.nu;i++){XsZ.dist[i].l = Znum;for(j=0;j<XsZ.tu;j++){if(i == Xs.data[j].j){XsZ.data[Znum].e = Xs.data[j].e; for(t=0;t<Xs.mu;t++){if(j>=Xs.dist[t].l&&j<=Xs.dist[t+1].l){XsZ.data[Znum].j = t;}}Znum = Znum + 1;}}}XsZ.dist[XsZ.nu].l = Znum;//***************************************************************************//打印转置矩阵 //***************************************************************************printf("CSR,打印转置矩阵如下:\n"); for (i = 0; i<XsZ.mu; i++){if(XsZ.dist[i+1].l-XsZ.dist[i].l>0){for(j = 0; j<XsZ.nu; j++){int bs = 0;for(t = XsZ.dist[i].l;t<XsZ.dist[i+1].l;t++){if(j == XsZ.data[t].j){printf("%g\t",XsZ.data[t].e);bs = 1;break;}}if(bs == 0){printf("0\t");}} } else {for(j = 0; j<Xs.nu; j++){printf("0\t");}}putchar('\n');//每行结束换行}system("pause");//运行结果停留显示,不会一闪而过
}

input.bat文件内容示例如下:
下面展示一些 文本内容。

15
15
0 2.8 0 0 0 0 0 0 0 0 0 0 0 0 0
-4.3 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3
0 0 0 0 0 0 8 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 3.5 0 0 0 86 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 7 0 0 0
0 0 4 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 7 0 0 0 0 0 0 0 0 0 0 5 0 0
0 0 0 3 0 0 23 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 6 0 0 0 0 1.1 0 0 0
9 0 0 0 0 0 0 0 2 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 -8.52

C语言实现稀疏矩阵存储和转置相关推荐

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

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

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

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

  3. 稀疏矩阵的三元组存储方法c语言,数据结构C语言版 稀疏矩阵的三元组顺序表存储表示和实现...

    陈独秀的秘密 数据结构C语言版 稀疏矩阵的三元组顺序表存储表示和实现 P98 编译环境:Dev-C++ 4.9.9.2 日期:2011年2月8日 */ typedef int ElemType; // ...

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

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

  5. 稀疏矩阵的存储以及转置、加法、乘法操作实现

    1.稀疏矩阵的存储与表示 只存储稀疏矩阵中极少数的非零元素,采用一个三元组<row,column,value>来唯一确定一个矩阵元素:因此,稀疏矩阵可用一个三元组数组来表示.另外,还需要存 ...

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

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

  7. CSR稀疏矩阵存储方式

    矩阵可分为稠密矩阵和稀疏矩阵,对于稀疏矩阵而言,使用同样的内存来存储这个矩阵显然是对内存的浪费,那么我们就可以想办法将矩阵中所有的o元素挥着不相关元素剔除,怎么剔除,第一种方法是通过三个一维矩阵来存储 ...

  8. 存储过程debug值not a variable_C语言变量的存储类别

    在程序中经常会使用到变量,在C程序中可以选择变量的不同存储形式,其存储类别分为静态存储和动态存储.可以通过存储类别修饰符来告诉编译器要处理什么样的类型变量,具体主要有自动(auto).静态(stati ...

  9. 单片机c语言存数据,单片机中C语言的数据存储与程序编写

    一.五大内存分区 内存分成5个区,它们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 1.栈区(stack):FIFO就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区. ...

最新文章

  1. 两个主键怎么设置tsql_索引该怎么创建?
  2. Sqlserver__数据表排序记录和界面显示排序记录不一致的问题
  3. SAP日记之一-漫漫自学路
  4. eclipse下查看maven下载的源码中文乱码问题
  5. iPhone12年简史:手机之王的荣耀与溃败
  6. Spark 整合ElasticSearch
  7. java常量映射_java-基础 - 常量与变量
  8. SPOJ375 Query on a tree(LCT边权)
  9. 【ETL工具】-Kettle详细教程
  10. 精致女生必备6款实用app 这几款你值得拥有
  11. 阿里云视频点播+项目实战
  12. 计算机学院嘉年华标题,“芯动盛夏 AI创南航” 计算机学院举办第八届计算机嘉年华...
  13. c语言指针数组分配内存,指针数组数组指针的分配内存及函数参数 C语言版
  14. 关于Java字符串的全部,就在这篇文章里了
  15. 搭建高可用的nacos集群
  16. C++ 实现隐藏窗口和任务栏图标,再也不用担心玩游戏被发现了
  17. 使用CSS实现多种Noise噪点效果
  18. NIPS(Conference and Workshop on Neural Information Processing Systems)
  19. CC00185.CloudKubernetes——|KuberNetes配置管理.V16|——|configmap.secret热更新.v02|configmap编辑方式|
  20. python小游戏毕设 记忆翻牌小游戏设计与实现 (源码)

热门文章

  1. 【互联网及其应用】第2章互联网技术
  2. mysql全文索引定义语法分析器
  3. MT6765/p40处理器性能/芯片参数分析
  4. 【FLASH存储器系列十三】Nand flash出厂就有坏块,NOR flash有吗?
  5. 去除浏览器首页的方法(hao123,2345...)
  6. 〔魅惑之都〕电脑操作最忌讳的十八个小动作!!用电脑的请注意看哟~~
  7. 计算4000000000以内最大的f(n)=n的值---字符串问题python实现(五)
  8. android 接口403,403: 请求被理解,但它被拒绝 Twitter Android_android_开发99编程知识库...
  9. ntel Xeon E5-2658的CPU核ID和线程ID的对应关系
  10. linux卸载nfs软件,linux nfs客户端卸载