我们假设在m*n的矩阵中,有t个元素不为0,令a=t/(m*n),称a为矩阵的稀疏因子,通常认为a<=0.05时称为稀疏矩阵
为了节省存储空间,我们对稀疏矩阵进行压缩存储——只存储稀疏矩阵的非零元。因此,除了存储非零元的值之外,还必须同时记下它所在行和列的位置,反之,一个三元组(i, j, aij)惟一确定了矩阵A的一个非零元。由此,稀疏矩阵可由表示非零元的三元组及其行列数惟一确定。
例如,下列三元组表
((1,2,12),(1,3,9),(3,1,-3),(3,6,14),(4,3,24),(5,2,18),(6115),(6,4,7))
加上(6,7)这一对行、列值便可作为下图矩阵M的另一种描述。

假设以顺序存储结构来表示三元组表,则可得稀疏矩阵的一种压缩存储方式——我
们称之为三元组顺序表。

在此,data域中表示非零元的三元组是以行序为主序顺序排列的。下面将讨论在这种压缩存储结构下如何实现矩阵的转置运算
显然,一个稀疏矩阵的转置矩阵仍然是稀疏矩阵。假设a和b是Tsmatrix型的变量,分别表示矩阵M和T。那么,如何由a得到b呢?
从分析a和b之间的差异可见只要做到:(1)将矩阵的行列值相互交换;(2)将每个三
元组中的I和j相互调换;(3)重排三元组之间的次序便可实现矩阵的转置。前二条是容易做到的,关键是如何实现第三条。即如何使b. data中的三元组是以T的行(M的列)为主序依次排列的。
下面我讲一个自认为十分巧妙也是很好理解的一种处理办法:
我们在a中即矩阵M中,以列序为主序对非零元进行顺序排列,很好理解,这就是M进行转置运算后得到的矩阵T中以行序为主序对非零元进行顺序排列相应的序列。即实现了b. data中的三元组是以T的行(M的列)为主序依次排列的。
思路如下:
为了确定a中非零元以列序为主序进行顺序排列的序列,在转置前,应先求得M的每一列中非零元的个数,进而求得每一列的第一个非零元在b. data中应有的位置。
在此,需要附设num和cpot两个向量。num[col]表示矩阵M中第col列中非零元
的个数,cpot[col]指示M中第col列的第一个非零元在b. data中的恰当位置。代码实现如下:

       for(col=0;col<M.ru;col++)  num[col]=0;for(t=0;t<M.tu;t++)  ++num[M.data[t].j];//求出每一列中非零元的个数cpot[0]=0;//第一列的第一个非零元计数为0for(col=1;col<M.tu;col++){cpot[col]=cpot[col-1]+num[col-1];//从第二列开始,每一列第一个非零元序列为上一列第一个非零元序列加上是上一列的非零元数}for(t=0;t<M.tu;t++){col=M.data[t].j;q=cpot[col];T.data[q].i=M.data[t].i;T.data[q].j=M.data[t].j;T.data[q].e=M.data[t].e;++cpot[col];//这一列下一个非零元序列在是一个基础上加一}

全部参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define ElemType int
#define MAXSIZE 100
typedef struct{int i,j;ElemType e;
} Triple;
typedef struct{Triple data[MAXSIZE];int mu,ru,tu;//矩阵的行数、列数和非零元个数
}TSMatrix;
int main(){TSMatrix M,T;int col,num[100],cpot[100],t,q,i,j,m,n;int b[7][6];int a[6][7]={1,12,9,0,0,0,0,0, 0,0,0,0,0,9,-3,0,0,0,0,14,0,0,0,24,0,0,0,0,0,18,0,0,0,9,0,15,0,0,-7,0,0,9     }; M.mu=6;M.ru=7;M.tu=0;for(i=0;i<6;i++){for(j=0;j<7;j++){if(a[i][j]!=0){M.data[M.tu].i=j;M.data[M.tu].j=i;M.data[M.tu].e=a[i][j];M.tu++;}}}T.ru=M.mu;T.mu=M.ru;T.tu=M.tu;if(T.tu){for(col=0;col<M.ru;col++)num[col]=0;for(t=0;t<M.tu;t++)++num[M.data[t].j];cpot[0]=0;for(col=1;col<M.tu;col++){cpot[col]=cpot[col-1]+num[col-1];}for(t=0;t<M.tu;t++){col=M.data[t].j;q=cpot[col];T.data[q].i=M.data[t].i;T.data[q].j=M.data[t].j;T.data[q].e=M.data[t].e;++cpot[col];}}memset(b,0,sizeof(int)*7*6);for(t=0;t<T.tu;t++){m=T.data[t].i;n=T.data[t].j;b[m][n]=T.data[t].e;printf("%d,%d,%d\n",T.data[t].i,T.data[t].j,T.data[t].e);//输出非零值在原矩阵中的位置及数值
}for(i=0;i<T.mu;i++){for(j=0;j<T.ru;j++)printf("%3d\ ",b[i][j]);printf("\n");}return 0;
}

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

  1. 如何用三元组表表示下列稀疏矩阵_稀疏矩阵的压缩存储可以用一个三元组表来表示稀疏矩阵中的非0元素。...

    问题:稀疏矩阵的压缩存储可以用一个三元组表来表示稀疏矩阵中的非0元素. 答案:对 更多相关问题 (本小题满分10分)已知抛物线的焦点坐标是F(0,-2), 求它的标准方程. I bought a dr ...

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

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

  3. 稀疏矩阵的压缩存储--十字链表(转载)

    稀疏矩阵的压缩存储--十字链表(转载)<?xml version="1.0" encoding="UTF-8"?> 来自为知笔记(Wiz) 转载于: ...

  4. 稀疏矩阵的压缩存储与转置

    稀疏矩阵:矩阵中大多数元素为0的矩阵(本文以行序为主序) 稀疏矩阵的三元组表述法: 类型结构: template <typename T> struct Triple {int _row; ...

  5. 稀疏矩阵的压缩存储与操作(实测程序)

    第1关:基于三元表顺序存储的稀疏矩阵的转置与输出(测试) 任务描述 本关任务:写一个程序,使用三元组顺序表存储一个稀疏矩阵,然后求出其转置矩阵并输出. 相关知识 为了完成本关任务,你需要掌握: 1.三 ...

  6. 稀疏矩阵的压缩存储的两种策略

    来自王道数据结构

  7. 矩阵的压缩存储(随机稀疏矩阵的建立和输出)

    实际应用中会有很多利用高阶矩阵的问题,有的高阶矩阵已达到几十万阶,几千亿个元素.然而,多数的高阶矩阵中包含了大量的数值为零的元素,需要对这类矩阵进行压缩存储.因为合理的压缩存储不仅能有效地节省存储空间 ...

  8. 特殊矩阵的压缩存储(对称矩阵,三角矩阵,对角矩阵,稀疏矩阵的顺序,链序存储,十字链表的建立)

    特殊矩阵的压缩存储 压缩存储的定义: 若多个数据元素的值都相同,则只分配一个元素值的存储空间,且 零元素不占存储空间. 能够压缩的一些矩阵: 一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等 ...

  9. 特殊矩阵的压缩存储(详细版 通俗易懂 含c语言稀疏矩阵十字链表代码 )

    前言 此文章是本人第一篇博客,目的在于巩固过去所学的知识,同时可能会给大家带来一丝丝帮助,但由于没有经验加上本人能力极其有限,文章中可能存在不足之处,还请读者能够指正(`・ω・´). 这篇文章首先会介 ...

最新文章

  1. 利用jmap和MAT等工具查看JVM运行时堆内存
  2. nginx中js修改不生效的问题
  3. python课程ppt_Python电子教学课件12程序设计基本方法.ppt
  4. MQTT工作笔记0009---订阅主题和订阅确认
  5. 我在用的浏览器插件利器
  6. python打电话播放语音_让电话录音也能看得见,录音一键转为文字
  7. cfda计算机管理化系统,计算机化系统清单
  8. 【HighCharts系列教程】一、认识Highcharts
  9. myeclipse 创建和访问 servlet 项目
  10. 微信小程序云开发--云存储的使用(一)
  11. python绘制中国_如何用Python画一个中国地图?
  12. virtualbox vbox虚拟机去虚拟化软件使用教程 硬件级虚拟机系统 超能版 V2020
  13. 画图形表格用ECharts
  14. 【Unity3D】相机跟随
  15. BLE Mesh (8) —— Friendship
  16. Codeup——577 | 问题 C: 等腰梯形
  17. C语言基础——数据储存
  18. husky实现git commit规范
  19. Electropure EDI 中国区2019年年度总结会议
  20. autodyn之状态方程(EOS)

热门文章

  1. VSCode修改默认浏览器为Chrome
  2. idea控制台乱码解决办法
  3. Stages — 研发过程可视化建模和管理平台
  4. 如何快速的进行sql脚本升级
  5. 程序六原则及23种设计模式成诗随笔
  6. NTT 的 C/C++ 实现
  7. jq获取当前周从星期一到星期天的日期
  8. nvue页面使用icon
  9. PUMA彪马用未成年人做代言人被罚10万元,已经是“二进宫”
  10. 如何通过脚本将虾米音乐的收藏列表导出成excel