c语言稀疏矩阵的存储,C语言:数据结构-稀疏矩阵的压缩存储

https://m.toutiaocdn.com/group/6712258385510662667/?app=news_article&timestamp=1562855219&req_id=201907112226580100230300187166DEA&group_id=6712258385510662667

(1)稀疏矩阵的特点

在一个m×n的矩阵中,设矩阵中有i个元素不为零,并令△=i/(m×n),称△为稀疏因子。通常当△≤0.05时。认为该矩阵为稀疏矩阵。

对这类矩阵实现压缩存储的基本思路是只需要存储其非零元素,但由于稀疏矩阵中零元素的分布没有一定规律,所以必须同时记下零元素所在的行和列。才能对矩阵有效的缩压,并能正确的恢复它。

(2)稀疏矩阵的压缩存储原理

只存储非零元素ai,j和相应的行、列序号i、j。具体方法:对稀疏矩阵中每一个非零元素设定一个三元组(i,j,ai,j),将所有三元组按行优先排列,组成一个三元组表(线性表)。只要存储三元组表和该矩阵的行、列数,就能唯一确定该矩阵。

例5.8 按稀疏矩阵的压缩存储方法,求矩阵A的存储信息。

165799785_1_20190711102948350

稀疏矩阵A

分析:设左上角的元素所在位置为第1行第1列,矩阵的行、列及非零元素个数为:(5,6,6)相应的三元组表为:(1,2,12)(1,3,9)(3,1,3)(3,6,14)(4,3,24)(5,2,16)。

(3)存储方法

通过上述转换,对稀疏矩阵的压缩存储,化为对其三元组表和相关信息的存储。

用结构体类型描述三元组

typedef struct { int i , j ; detetype e; }triple d; /* 三元组类型 */

结构体triple的成员i,j分别是非零元素的行、列下标,成员e是非零元素。 triple d 说明了triple类型的结构体变量d,并分配了存储单元,如图5-9(a)所示。triple data [10]说明了triple类型的有10个数组元素的结构体数组,如图5-9(b)所示。

165799785_2_20190711102948491

三元组类型的变量和数组的结构图

用结构体类型描述三元组表和相关信息typedef struct{ int mu, nu, tu ;triple data [ max+1] ; /*max+1是最多的元素个数*/}triplegrupe; /*三元组表类型*/triplegrupe a;

说明了三元组表类型的变量a,有4个成员项,mu﹑nu分别表示稀疏矩阵的行﹑列数,tu表示稀疏矩阵中的非零元素的个数;data表示非零元素的三元组表。

例5.9

165799785_3_20190711102948585

矩阵

165799785_4_20190711102948679

稀疏矩阵a的存储结构

(4)算法举例

例5.10 如图5-12所示,求压缩存储的稀疏矩阵A的转置矩阵AT。

165799785_5_20190711102948757

A与其转置矩阵AT

分析:

由A得到三元组表:

((1,1,1),(1,3,5),(1,5,2),(2,1,7),(3,1,3),(3,3,6))

把上述三元组表中的各三元组的行﹑列互换得到的AT的三元组表为:

((1,1,1),(3,1,5),(5,1,2),(1,2,7),(1,3,3),(3,3,6))

存在问题:按上述方法得到的转置后矩阵AT的新三元组表没有能按行序为主序存储。

为了使新三元组表要按行序为主序存储,就要按原表的列为主序排列。而原三元组表是按行序为主存储的,所以同一列中的各行已按行序由小到大顺序排列。

方法如下:

按第1,2,3,…n列的顺序,逐次扫描A相应的三元组表,依次把得到的第1,2,…,n列的三元组中的行、列互换,存入新三元组表。每次扫描中,因为相同列的三元组按扫描的先后顺序存入。这保证了新三元组表以行序为主针对A的三元组表:

以第1列扫描,找到:(1,1,1),(2,1,7),(3,1,3)。

交换行和列的坐标存入新表。

以第2列扫描,未找到。

以第3列扫描,找到:(1,3,5),(3,3,6)。

交换行和列的坐标存入新表。

以第4列扫描,未找到。

以第5列扫描,找到:(1,5,2)。

交换行和列的坐标存入新表。

新表为:

(1,1,1),(1,2,7),(1,3,3),(3,1,5),(3,3,6),(5,1,2)

程序

void transpose (triplegrupe a, tripletgrupe b) { int p,q,col; b.mu=a.nu; b.nu =a.mu; b.tu =a.tu; if(b.tu) { q=1; for(col=1 ; col≤a.nu; col++) for(p=1 ; p≤a.tu; 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].e; q++; } } }

其中:

a是稀疏矩阵的三元组表,b是转置矩阵的三元组表;

p是稀疏矩阵的三元组数组下标.q是转置矩阵的三元组数组下标;

a.mu是稀疏矩阵的行数,a.nu是稀疏矩阵的列数;

a.tu是稀疏矩阵三元组数元素的个数;

col是循环变量。

在稀疏矩阵三元组中从第1列扫描到a.nu列,若找到相应列的三元组,则把行﹑列互换存入转置矩阵的三元组。

存储变化示意图

转置前:如图5-13(a)、图5-13(b)、图5-13(c)所示。

转置后:如图5-13(d)、图5-13(e)、图5-13(f)所示。

165799785_6_20190711102948866

程序运行前后存储变化示意图(a)矩阵A;(b)矩阵A的行﹑列信息;(C)矩阵A的三元组数组

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机C语言课交作业怎么交,第一份c语言作业

2.1 你对软件工程专业或者计算机科学与技术专业了解是怎样?•答案: 软件工程专业是个年轻的专业,紧跟这个信息化的新时代。我学习它是因为感兴趣,经过一周的学习,我了解了一些 该专业课程主要是c语言程序设计和计算机导…

python风控工具_python-风控模型分析01

数据导入与查看# -*- coding: utf-8 -*-# %%time# from pyhive import prestoimport pandas as pdimport numpy as npimport warningsimport osdatapd.read_csv(*/全域风险.csv)data.head(2)# label pd.DataFrame(list(result),columnscolumns_names)# label.to_csv(/data/ljk/…

查看某个文件是否正在被修改

1、首先执行命令,写到1.log文件下面: find -name *.rdb|xargs stat| grep -i Modify | awk -F. {print $1} | awk {print $2$3}| awk -F- {print $1$2$3} | awk -F: {print $1$2$3} > 1.log 2、再等待1分钟,执行命令,写到2.log…

c语言位运算+乘法,关于c语言中的位运算。。。

标签&#xff1a;c位运算是一种针对二进制数的一种运算位运算 共有六种都有其对应得操作符号& (and) 位于| (or) 位或~ (not) 取反^ (xor) 异或>> (shr) 右移一位<< (shl) 左移一位运算说明&a…

python模型保存save_浅谈keras保存模型中的save()和save_weights()区别

今天做了一个关于keras保存模型的实验&#xff0c;希望有助于大家了解keras保存模型的区别。我们知道keras的模型一般保存为后缀名为h5的文件&#xff0c;比如final_model.h5。同样是h5文件用save()和save_weight()保存效果是不一样的。我们用宇宙最通用的数据集MNIST来做这个实…

技术淘宝

? ? ? ? 精度前端学习 —— 前端开发100天&#xff08;置顶&#xff09; http://alloyteam.github.io/CodeGuide/https://github.com/AlloyTeam/CodeGuide cmd控制台的小技巧&#xff1a;可以直接将文件夹/文件丢进去&#xff0c;这样就会打印出该路径了。 舒服的字体家族…

vue 导出_Vue核心知识:8.3 vuex在vue-cli中的应用,文件之间的导出与引入

问题&#xff1a;vuex在vue-cli中的应用第一步&#xff1a;npm下载vuex资源包&#xff1a;npm install vuex --save第二步&#xff1a;在 src/main.js 中引入import Vue from vue import Vuex from vuexVue.use(Vuex)import store from ./vuex/store第三步&#xff1a;在 src 下…

android界面设计字体大小,Andoird用户界面设计上手指南:设置字体大小

教程详解技术应用: AndroidOS / Android SDK难易程度: 简单预计完成时间: 15分钟【51CTO译文】在本文中&#xff0c;我们将介绍一些简单的处理方式&#xff0c;帮助开发人员轻松编写出能够应对各类设备型号的应用程序文本方案&#xff0c;同时为用户提供自定义文字尺寸功能。别…

回溯算法解决八皇后_4皇后问题和使用回溯算法的解决方案

回溯算法解决八皇后4-皇后问题 (4 - Queens problem) In 4- queens problem, we have 4 queens to be placed on a 4*4 chessboard, satisfying the constraint that no two queens should be in the same row, same column, or in same diagonal. 在4个皇后问题中 &#xff0c…

MAVEN 私有仓库库迁移

一、下载 Nexus:cd /usr/local/srcwget http://download.sonatype.com/nexus/oss/nexus-xxxx-bundle.tar.gz二、安装配置授权 cd /var/app/sudo cp nexus-xxxx-bundle.tar.gz /var/app/cd /var/app/sudo tar xvzf nexus-xxxx-bundle.tar.gzln -s nexus-xxxx nexuscp nexus/bin/…

写python笔记本推荐_写个python程序帮你清理垃圾

起步知识概要【临时文件(*.tmp)】【临时文件(*._mp)】【日志文件(*.log)】【临时帮助文件(*.gid)】【磁盘检查文件(*.chk)】【临时备份文件(*.old)】【Excel备份文件(*.xlk)】【临时备份文件(*.bak)】【COOKIE】 cookies\*.*【文件使用记录】 recent\*.*【IE临时文件】 Tempora…

0623TP框架联系

先用框架查询 namespace Home\Controller;use Home\Controller\FuLeiController; class WccController extends FuLeiController {//查看项目的方法function xiangmu(){$xiangmuD("xiangmu");$zhi$xiangmu->select();$this->assign("zhi",$zhi);$thi…

怎么重置blockinput的锁_OPPOA9锁屏密码忘了怎么办? OPPO忘记锁屏密码的解决办法...

看点&#xff1a;iPhone X原装屏与国产屏有哪些区别&#xff1f;看点&#xff1a;换7P、8P屏幕&#xff1a;C11和DTP和DKH的区别狮淘&#xff1a;不锈钢拆机片5个只需9.9元&#xff01;包邮&#xff01;每天10名OPPOA9锁屏密码忘了怎么办&#xff1f;OPPO A9手机忘记了锁屏密码…

Android的面孔_Actiyity

一、什么是Activity&#xff1f; 简单的说&#xff1a;Activity就是布满整个窗口或者悬浮于其他窗口上的交互界面。在一个应用程序中通常由多个Activity构成&#xff0c;都会在Manifest.xml中指定一个主的Activity&#xff0c;如下设置 <actionandroid:name"android.in…

vsco怎么两个滤镜叠加_10 款超美的 VSCO 调色滤镜,怎么用都好看!

VSCO 里的滤镜简单 又 好看可太让人喜欢了&#xff01;但是 VSCO 的滤镜实在太多太多了有点让人眼花缭乱~今天旅拍菌请来了 摄影博主 丹丹儿啊专门来为大家盘点一波超美的 VSCO 滤镜合集&#xff01;怎么用 都很好看~微博&#xff1a;丹丹儿啊01滤镜&#xff1a;1ND1锐化&#…

linuxSAMBA共享

转自http://blog.chinaunix.net/uid-20537084-id-2977850.html经常要在Windows与Linux之间共享文件&#xff0c;Samba是一个很常见的选择&#xff1a;Linux运行Samba服务&#xff0c;Windows访问Linux上共享的文件。在不需要用户访问控制的场景下&#xff0c;Samba服务的安全级…

python状态码409_HTTP状态码

HTTP各种相应的状态码HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。它由 RFC 2616 规范定义的&#xff0c;并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。中文名HTTP状态码外文名HTTP Status Code规范定义RFC 2616消息端…

Kubernetes Master High Availability 高级实践

才云科技云开源高级工程师唐继元受邀DBAplus社群&#xff0c;在线分享《Kubernetes Master High Availability 高级实践》&#xff0c;介绍如何构建Kubernetes Master High Availability环境。 以下是分享实录&#xff1a; 大家好&#xff0c;我是才云科技的唐继元&#xff0c;…

pythonmysqldb_python中MySQLdb的使用

基本的使用如上&#xff0c;还是很简单的&#xff0c;进一步使用还没操作&#xff0c;先从网上找点资料放上来&#xff0c;以备后续查看1.引入MySQLdb库import MySQLdb2.和数据库建立连接connMySQLdb.connect(host"localhost",user"root",passwd"sa&q…

分布式系统的唯一ID

2019独角兽企业重金招聘Python工程师标准>>> 需求 为什么需要唯一ID 让分布式系统中的需要辨别的元素&#xff0c;都能有唯一的辨识标志。 几乎所有的业务系统&#xff0c;都有生成一个记录标识的需求&#xff0c;例如&#xff1a; 消息标识&#xff1a;message-id订…