11、稀疏矩阵的压缩存储

news/2024/9/27 9:09:21

1、稀疏矩阵的压缩存储定义和初始化

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<assert.h>
#include<memory.h>#define ElemType int
#define MAXSIZE 100typedef struct Triple{int row;//数据所在行 int col;//数据所在列 ElemType value;//数据 
}Triple;typedef struct SMatrix{Triple data[MAXSIZE];int total_row;//总行数 m行 int total_col;//总列数  n行int not_zero_count;//非零元素个数 
}SMatrix;// Spare Mastrixvoid CreateMatrix(SMatrix *M){FILE *fp = fopen("C:\\Users\\16326\\Desktop\\ds\\matrix.txt","r");if(fp == NULL){exit(1);}fscanf(fp, "%d %d", &M->total_col, &M->total_row);//printf("%d %d", M->mu, M->nu);int value;int k = 0;//记录data数组下标 ,也是非零元素个数 int i =0, j = 0;for(i = 0;i < M->total_col;i++){//遍历行 for(j = 0;j < M->total_row;j++){//遍历列 fscanf(fp,"%d",&value);if(value != 0){M->data[k].value = value;//记录数据 M->data[k].row = i;//记录行 M->data[k].col = j;//记录列k++; //非零元素个数 ++
            }}}M->not_zero_count = k;//记录非零元素个数 fclose(fp);//关闭流 
}
/*
matrix.txt
6 7
0 12 9 0 0 0 0
0 0 0 0 0 0 0
-3 0 0 0 0 14 0
0 0 24 0 0 0 0
0 18 0 0 0 0 0
15 0 0 -7 0 0 0
*/

2、稀疏矩阵转置和快速转置方法

//将 M 转置后储存到 T 中 
void transposeMatrix(SMatrix *M,SMatrix *T){T->total_row = M->total_col;T->total_col = M->total_row;T->not_zero_count = M->not_zero_count;int i = 0,k = 0,q = 0;//遍历列,从第一列开始转置for(i;i < M->total_col;i++){//遍历所有非零元素 for(k = 0;k < M->not_zero_count;k++){if(M->data[k].col == i){T->data[q].value = M->data[k].value;T->data[q].col = M->data[k].row;T->data[q].row = M->data[k].col;q++;}}} }void FastTransposeMatrix(SMatrix* M,SMatrix* T){if(M->not_zero_count == 0)return;T->total_row = M->total_col;T->total_col = M->total_row;T->not_zero_count = M->not_zero_count;//用于记录每一列非零元素的个数 int* num = (int*)malloc(sizeof(int) * M->total_col);assert(num != NULL);//用于记录每一列的应该存储在数组的下标位置int* cpos = (int*)malloc(sizeof(int) * M->total_col);    assert(cpos != NULL);int col = 0;//初始化num for(col = 0;col < M->total_col;col++)num[col] = 0;//遍历所有的非零元素,记录每一列非零元素的个数int i = 0;for(i = 0;i < M->not_zero_count;i++){col = M->data[i].col;num[col]++; } //初始化第一列的元素在对应起始下标位置为0 cpos[0] = 0;//其他列为上一列的起始位置加上一列非零元素的个数 for(col = 1;col < M->total_col;col++){cpos[col] = cpos[col - 1] + num[col - 1];}//进行转置int pos = 0;for(i = 0;i < M->not_zero_count;i++){//获取该元素所在列 col = M->data[i].col;//获取该元素应该存储在目标数组的下标 pos = cpos[col]; T->data[pos].value = M->data[i].value;T->data[pos].col = M->data[i].row;T->data[pos].row = M->data[i].col;//该列的下一个元素存储在目标数据下标 cpos[col]++;} 
}

3、其他方法实现

void PrintMatrix(SMatrix *M){ int i = 0;printf("row=%d, col=%d\n",M->total_row,M->total_col); for(i = 0;i < M->not_zero_count;i++){//注意:行和列从0开始printf("(%d,%d,%d)\n",M->data[i].row,M->data[i].col,M->data[i].value);}
}void CopyMatrix(SMatrix *M, SMatrix *T){T->total_row = M->total_row;T->total_col = M->total_col;T->not_zero_count = M->not_zero_count;int k = 0;for(k;k < M->not_zero_count;k++){T->data[k].row = M->data[k].row; T->data[k].col = M->data[k].col; T->data[k].value = M->data[k].value; }
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

救园倒计时:救园最后4天

救园目的:园子这三年困难阶段靠贷款维持,救园是为了还掉贷款,度过难关。救园方式: 终身会员计划,会员,捐助,周边。救园之后,一边增加收入来源,一边加快推进园子的商业化救园进展 截止9月27日 08:55终身会员:终身VIP会员名额还剩37个,终身VIP会员名额还剩130个 会员总…

将对象的属性为数值型的转换为String

将对象的属性为数值型的转换为String 1、新建一个类 //注意:此处为待转换的类型,return true 不好用,必须将待转换的类型一一列出using Newtonsoft.Json;namespace WinFormsApp1.Common {public class ToStringConverter : JsonConverter{public override bool CanConvert(T…

《HelloGitHub》第 102 期

兴趣是最好的老师,HelloGitHub 让你对编程感兴趣!简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。github.com/521xueweihan/HelloGitHub这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、Java、Go、C/C++、Swift...让你在短…

弹幕树洞项目功能新增篇

项目地址 项目后端地址:https://github.com/ZyPLJ/ZYTteeHole项目前端页面地址:ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue目前项目测试访问地址:http://tree.pljzy.top/ 注意是http,输成https就访问到博客里面去了。系列文章📖.NET Core搭配V…

Cisco Secure Firewall Threat Defense 7.6.0 发布下载,新增功能概览

Cisco Secure Firewall Threat Defense 7.6.0 发布下载,新增功能概览Cisco Secure Firewall Threat Defense 7.6.0 发布下载,新增功能概览 Firepower Threat Defense (FTD) Software Release 7.6.0 Firepower 1100/3100/4100/4200/9300 Security Appliance 请访问原文链接:h…

【译】通过新的 WinUI 工作负荷和模板改进,深入原生 Windows 开发

我们创建了一个新的 Windows Dev Center 页面,简化了我们的 Getting Started with WinUI 文档,并与 Visual Studio 合作来改善开发人员在工作负荷和模板方面的体验。在 Build 2024 上,WinUI 团队宣布将重新关注 WinUI,将其作为我们推荐的原生 Windows 应用开发的首要应用开…

Windows10永久拒绝升级Win11

一、使用组策略阻止升级到windows11 需要专业版或企业版的Windows 10才能访问组策略编辑器。以下是操作步骤:单击开始菜单,输入gpedit.msc,打开本地组策略编辑器。 导航到“计算机配置”>“管理模板”>“Windows组件”>“Windows更新”>“适用于企业的Windows更…

arcgis怎样把面图层按另一面图层分割

摘自https://jingyan.baidu.com/article/6079ad0e9b5c8428fe86db70.htmlarcgis的桌面软件 主要应用于空间数据处理和管理,工作中往往会遇到要批量分割大量的面状数据,并且要按照其所处面的关系赋值。1、打开ArcMap软件,把两个面图层都加载到视图区域内,如下图2、在工具栏中…