稀疏矩阵的三元组表示----(算法详解)

目录

基本算法包括:(解释都在代码里)

1.创建

2.对三元组元素赋值

3.将三元组元素赋值给变量

4.输出三元组

5.转置(附加的有兴趣可以看看)


稀疏矩阵的概念:矩阵的非零元素相较零元素非常小时,这个矩阵就叫稀疏矩阵。

稀疏矩阵可以用三元组表示十字链表表示

本文章介绍三元组表示

稀疏矩阵的三元组表示。

三元组表示就是,用三个变量来存储非零元素的信息。

三元组线性表按顺序存储结构存储。

三元组顺序表的数据类型声明如下:

#include <stdio.h>
#define M 6
#define N 7
#define MaxSize  100         //矩阵中非零元素最多个数
typedef int ElemType;
typedef struct
{int r;					//行号int c;					//列号ElemType d;				//元素值
} TupNode;					//三元组定义
typedef struct 
{	int rows;				//行数int cols;				//列数int nums;				//非零元素个数TupNode data[MaxSize];
} TSMatrix;					//三元组顺序表

基本算法包括:(解释都在代码里)

1.创建

2.对三元组元素赋值

3.将三元组元素赋值给变量

4.输出三元组

5.转置(附加的有兴趣可以看看)

1.创建:

void CreatMat(TSMatrix &t,ElemType A[M][N])  //从一个二维稀疏矩阵创建其三元组表示
{int i,j;t.rows=M;t.cols=N;t.nums=0;for (i=0;i<M;i++){for (j=0;j<N;j++) if (A[i][j]!=0) 	//只存储非零元素{t.data[t.nums].r=i;t.data[t.nums].c=j;t.data[t.nums].d=A[i][j];t.nums++;}}
}

2.对三元组元素赋值

先找行后找列

bool Value(TSMatrix &t,ElemType x,int i,int j)  //三元组元素赋值
{int k=0,k1;if (i>=t.rows || j>=t.cols)return false;				//失败时返回falsewhile (k<t.nums && i>t.data[k].r) k++;					//查找行while (k<t.nums && i==t.data[k].r && j>t.data[k].c) k++;//查找列if (t.data[k].r==i && t.data[k].c==j)	//存在这样的元素t.data[k].d=x;else									//不存在这样的元素时插入一个元素{	for (k1=t.nums-1;k1>=k;k1--){t.data[k1+1].r=t.data[k1].r;t.data[k1+1].c=t.data[k1].c;t.data[k1+1].d=t.data[k1].d;}t.data[k].r=i;t.data[k].c=j;t.data[k].d=x;t.nums++;}return true;						//成功时返回true
}

3.将三元组元素赋值给变量

bool Assign(TSMatrix t,ElemType &x,int i,int j)  //将指定位置的元素值赋给变量
{int k=0;if (i>=t.rows || j>=t.cols)return false;			//失败时返回falsewhile (k<t.nums && i>t.data[k].r) k++;					//查找行while (k<t.nums && i==t.data[k].r && j>t.data[k].c) k++;//查找列if (t.data[k].r==i && t.data[k].c==j)x=t.data[k].d;elsex=0;				//在三元组中没有找到表示是零元素return true;			//成功时返回true
}

4.输出三元组

void DispMat(TSMatrix t)		//输出三元组
{int i;if (t.nums<=0)			//没有非零元素时返回return;printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);printf("\t------------------\n");for (i=0;i<t.nums;i++)printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d);
}

5.转置(附加的有兴趣可以看看)

void TranTat(TSMatrix t,TSMatrix &tb)		//矩阵转置
{int p,q=0,v;					//q为tb.data的下标tb.rows=t.cols;tb.cols=t.rows;tb.nums=t.nums;if (t.nums!=0)					//当存在非零元素时执行转置{for (v=0;v<t.cols;v++)		//tb.data[q]中的记录以c域的次序排列for (p=0;p<t.nums;p++)	//p为t.data的下标if (t.data[p].c==v){tb.data[q].r=t.data[p].c;tb.data[q].c=t.data[p].r;tb.data[q].d=t.data[p].d;q++;}}
}

总代码: c++

//稀疏矩阵的三元组表示-算法
#include <stdio.h>
#define M 6
#define N 7
#define MaxSize  100         //矩阵中非零元素最多个数
typedef int ElemType;
typedef struct
{int r;					//行号int c;					//列号ElemType d;				//元素值
} TupNode;					//三元组定义
typedef struct 
{	int rows;				//行数int cols;				//列数int nums;				//非零元素个数TupNode data[MaxSize];
} TSMatrix;					//三元组顺序表void CreatMat(TSMatrix &t,ElemType A[M][N])  //从一个二维稀疏矩阵创建其三元组表示
{int i,j;t.rows=M;t.cols=N;t.nums=0;for (i=0;i<M;i++){for (j=0;j<N;j++) if (A[i][j]!=0) 	//只存储非零元素{t.data[t.nums].r=i;t.data[t.nums].c=j;t.data[t.nums].d=A[i][j];t.nums++;}}
}
bool Value(TSMatrix &t,ElemType x,int i,int j)  //三元组元素赋值
{int k=0,k1;if (i>=t.rows || j>=t.cols)return false;				//失败时返回falsewhile (k<t.nums && i>t.data[k].r) k++;					//查找行while (k<t.nums && i==t.data[k].r && j>t.data[k].c) k++;//查找列if (t.data[k].r==i && t.data[k].c==j)	//存在这样的元素t.data[k].d=x;else									//不存在这样的元素时插入一个元素{	for (k1=t.nums-1;k1>=k;k1--){t.data[k1+1].r=t.data[k1].r;t.data[k1+1].c=t.data[k1].c;t.data[k1+1].d=t.data[k1].d;}t.data[k].r=i;t.data[k].c=j;t.data[k].d=x;t.nums++;}return true;						//成功时返回true
}bool Assign(TSMatrix t,ElemType &x,int i,int j)  //将指定位置的元素值赋给变量
{int k=0;if (i>=t.rows || j>=t.cols)return false;			//失败时返回falsewhile (k<t.nums && i>t.data[k].r) k++;					//查找行while (k<t.nums && i==t.data[k].r && j>t.data[k].c) k++;//查找列if (t.data[k].r==i && t.data[k].c==j)x=t.data[k].d;elsex=0;				//在三元组中没有找到表示是零元素return true;			//成功时返回true
}
void DispMat(TSMatrix t)		//输出三元组
{int i;if (t.nums<=0)			//没有非零元素时返回return;printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);printf("\t------------------\n");for (i=0;i<t.nums;i++)printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d);
}
void TranTat(TSMatrix t,TSMatrix &tb)		//矩阵转置
{int p,q=0,v;					//q为tb.data的下标tb.rows=t.cols;tb.cols=t.rows;tb.nums=t.nums;if (t.nums!=0)					//当存在非零元素时执行转置{for (v=0;v<t.cols;v++)		//tb.data[q]中的记录以c域的次序排列for (p=0;p<t.nums;p++)	//p为t.data的下标if (t.data[p].c==v){tb.data[q].r=t.data[p].c;tb.data[q].c=t.data[p].r;tb.data[q].d=t.data[p].d;q++;}}
}
int main()
{TSMatrix t,tb;int x,y=10;int A[6][7]={{0,0,1,0,0,0,0},{0,2,0,0,0,0,0},{3,0,0,0,0,0,0},{0,0,0,5,0,0,0},{0,0,0,0,6,0,0},{0,0,0,0,0,7,4}};CreatMat(t,A);//printf("b:\n"); DispMat(t);//if (Assign(t,x,2,5)==true)  //调用时返回true//	printf("Assign(t,x,2,5)=>x=%d\n",x);//else  //调用时返回false//	printf("Assign(t,x,2,5)=>参数错误\n");//Value(t,y,2,5);//printf("执行Value(t,10,2,5)\n");//if (Assign(t,x,2,5)==true)  //调用时返回true//	printf("Assign(t,x,2,5)=>x=%d\n",x);//else  //调用时返回false//	printf("Assign(t,x,2,5)=>参数错误\n");//printf("b:\n"); DispMat(t);TranTat(t,tb);printf("tb:\n"); DispMat(tb);return 1;
}

c总代码(需要自取)

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdbool.h>
#include <stdio.h>
#include <string.h> 
#include <stdlib.h>
//三元组表示
typedef int ElemType;
#define MaxSize 100
#define M 6
#define N 7
typedef struct Tup
{int r;int c;ElemType d;
}TupNode;
typedef struct TS
{int rows;int cols;int nums;TupNode data[MaxSize];
}TsMatrix;
void CreateMat(TsMatrix* t, ElemType A[M][N])
{int i, j;t->rows = M; t->cols = N; t->nums = 0;for(i = 0;i<M;i++)for(j=0;j<N;j++)if (A[i][j] != 0){t->data[t->nums].r = i; t->data[t->nums].c = j; t->data[t->nums].d = A[i][j]; t->nums++;}
}
bool Value(TsMatrix* t, ElemType x, int i, int j)
{if (i >= t->rows || j >= t->cols) return false;int k = 0;while (k<t->rows && i>t->data[k].r) k++;while (k<t->cols && i == t->data[k].r && j>t->data[k].c) k++;if (i == t->data[k].r && j == t->data[k].c) t->data[k].d = x;else {for (int k1 = t->nums - 1; k1 >= k; k1--){t->data[k1 + 1].r = t->data[k1].r;t->data[k1 + 1].c = t->data[k1].c;t->data[k1 + 1].d = t->data[k1].d;}t->data[k].r = i; t->data[k].c = j; t->data[k].d = x;t->nums++;}return true;
}
void DispMat(TsMatrix* t)
{if (t->nums <= 0) return;printf("\t%d\t%d\t%d\n", t->rows, t->cols, t->nums);printf("\t--------------------------\n");for (int k = 0; k < t->nums; k++)printf("\t%d\t%d\t%d\n", t->data[k].r, t->data[k].c, t->data[k].d);
}
bool Assign(TsMatrix* t, ElemType* x, int i, int j)
{if (i >= t->rows || j >= t->cols) return false;int k = 0;while (k < t->nums && i>t->data[k].r) k++;while (k<t->nums && i == t->data[k].r && j>t->data[k].c)k++;if (t->data[k].r == i && t->data[k].c == j) *x = t->data[k].d;else x = 0;return true;
}
void TranTat(TsMatrix* t, TsMatrix* b)
{if (t->nums != 0){b->rows = t->cols; b->cols = t->rows;b->nums = t->nums;int k1 = 0;for(int v = 0;v<t->cols;v++)for (int k = 0; k < t->nums; k++){if (t->data[k].c == v){b->data[k1].r = t->data[k].c;b->data[k1].c = t->data[k].r;b->data[k1].d = t->data[k].d;k1++;}}}}int main()
{ElemType A[6][7] = {{0,0,1,0,0,0,0},{0,2,0,0,0,0,0},{3,0,0,0,0,0,0},{0,0,0,5,0,0,0},{0,0,0,0,6,0,0},{0,0,0,0,0,7,4} };TsMatrix* t = (TsMatrix*)malloc(sizeof(TsMatrix));CreateMat(t, A);//Value(t, 7, 0, 4);ElemType e = 0;TsMatrix* b = (TsMatrix*)malloc(sizeof(TsMatrix));TranTat(t, b);/*Assign(t, &e, 1, 1);printf("%d", e);*/DispMat(b);return 0;
}

结语:

其实写博客不仅仅是为了教大家,同时这也有利于我巩固自己的知识点,和一个学习的总结,对文章有任何问题的还请指出,接受大家的批评,让我改进,如果大家有所收获的话还请不要吝啬你们的点赞和收藏,这可以激励我写出更加优秀的文章。

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

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

相关文章

生成式 AI 如何重塑软件开发流程和开发工具?

生成式AI正在重塑开发流程和开发工具&#xff0c;通过自动化和优化软件开发过程&#xff0c;提高开发效率和质量。它可以帮助开发人员快速生成代码、测试和部署应用程序&#xff0c;同时减少错误和缺陷。此外&#xff0c;生成式AI还可以帮助开发人员快速理解和解决复杂的技术问…

【QML COOK】- 006-用C++定义一个QML元素类型

Qt原本是一个C图形框架&#xff0c;因此QML也少不了C。QML通常只负责显示&#xff0c;而后台逻辑由C实现&#xff0c;因此掌握C和QML之间的交互非常必要。 本例实现一个最简单的例子&#xff0c;用C定义一个QML的元素类型并在QML使用它。 需求是在窗口上显示鼠标点击的次数。…

PowerDesigner简介以及简单使用

软件简介&#xff1a; PowerDesigner是Sybase公司开发的数据库设计工具&#xff0c;开发人员能搞利用PowerDesigner开发数据流程图、各数据模型如物理数据模型&#xff0c;可以分别从概念数据模型(Conceptual Data Model)和物理数据模型(Physical Data Model)两个层次对数据库…

尝试OmniverseFarm的最基础操作

目标 尝试OmniverseFarm的最基础操作。本地机器作为Queue和Agent&#xff0c;同时在本地提交任务。 主要参考了官方文档&#xff1a; Farm Queue — Omniverse Farm latest documentation Farm Agent — Omniverse Farm latest documentation Farm Examples — Omniverse Far…

虚幻UE 材质-纹理 1

本篇笔记主要讲两个纹理内的内容&#xff1a;渲染目标和媒体纹理 媒体纹理可以参考之前的笔记&#xff1a;虚幻UE 媒体播放器-视频转成材质-播放视频 所以本篇主要讲两个组件&#xff1a;场景捕获2D、场景捕获立方体 两个纹理&#xff1a;渲染目标、立方体渲染目标 三个功能&am…

jmeter分布式测试

场景&#xff1a;需求要求使用用大量的客户访问时&#xff0c;可以使用分布式来完成 分布式实现原理&#xff1a; 材料&#xff1a;一台控制机器&#xff0c;若干台代理机也叫执行机 运行时&#xff0c;控制机将脚本发送到代理机上-->代理机拿到就开始执行&#xff0c;不会…

论文阅读 BERT GPT - transformer在NLP领域的延伸

文章目录 不会写的很详细&#xff0c;只是为了帮助我理解在CV领域transformer的拓展1 摘要1.1 BERT - 核心1.2 GPT - 核心 2 模型架构2.1 概览 3 区别3.1 finetune和prompt 3.2 transformer及训练总结 不会写的很详细&#xff0c;只是为了帮助我理解在CV领域transformer的拓展 …

1.10 力扣回溯中等题

93. 复原 IP 地址 代码随想录 (programmercarl.com) 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1"…

构建安全可靠的系统:第十六章到第二十章

第四部分&#xff1a;维护系统 原文&#xff1a;Part IV. Maintaining Systems 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 准备应对不舒适情况的组织有更好的机会处理关键事件。 尽管不可能为可能扰乱您组织的每种情况制定计划&#xff0c;但作为综合灾难规划策略…

接口数据使用了 RSA 加密和签名?一篇文章带你了解

接口数据使用了RSA加密和签名&#xff1f;一篇文章带你搞定&#xff01; 1、前言 很多童鞋在工作中&#xff0c;会遇到一些接口使用RSA加密和签名来处理的请求参数&#xff0c;那么遇到这个问题的时候&#xff0c;第一时间当然是找开发要加解密的方法&#xff0c;但是开发给加…

1991-2022年A股上市公司股价崩盘风险指标数据

1991-2022年A股上市公司股价崩盘风险指标数据 1、时间&#xff1a;1991-2022年 2、来源&#xff1a;整理自csmar 3、指标&#xff1a;证券代码、交易年度、NCSKEW(分市场等权平均法)、NCSKEW(分市场流通市值平均法)、NCSKEW(分市场总市值平均法)&#xff1b; NCSKEW(综合市…

【Spring 篇】JdbcTemplate:轻松驾驭数据库的魔法工具

欢迎来到数据库的奇妙世界&#xff0c;在这里&#xff0c;我们将一同揭开Spring框架中JdbcTemplate的神秘面纱。JdbcTemplate是Spring提供的一个简化数据库操作的工具&#xff0c;它为我们提供了一种轻松驾驭数据库的魔法。本篇博客将详细解释JdbcTemplate的基本使用&#xff0…

我的 AI 成长星球,邀请你加入

大家好啊&#xff0c;我是董董灿。 2023年终总结时我这个小白坚持写作一整年&#xff0c;赚了多少&#xff1f;提到了一点&#xff0c;2024希望自己创建一个免费星球。 其实一直就想弄一个高质量的 AI 知识交流平台&#xff0c;方便大家一起交流和学习&#xff0c;同时提高对 …

我的年度总结(大一程序员的自述)

呀哈喽&#xff0c;我是结衣。 我也来参加这个年度总结的话题咯&#xff0c;喜欢的话可以点个赞哦。 作为一个大一新生&#xff0c;我从1级的编程小白到了现在的2级编程小白。在7月份之前我可以说是完全不了解编程的一位新人&#xff0c;对应电脑的了解也就只会打游戏看电视和浏…

Qt QCheckBox复选按钮控件

文章目录 1 属性和方法1.1 文本1.2 三态1.3 自动排他1.4 信号和槽 2 实例2.1 布局2.2 代码实现 Qt中的复选按钮类是QCheckBox它和单选按钮很相似&#xff0c;单选按钮常用在“多选一”的场景&#xff0c;而复选按钮常用在"多选多"的场景比如喜欢的水果选项中&#xf…

暴雨信息发布算力网络应用平台打造零感知算网服务新模式

为进一步优化算力网络应用服务能力和降低算力网络使用难度&#xff0c;暴雨信息突破基于算力网络的实例跨域协同与迁移、基于测试评估的应用度量和解构等技术&#xff0c;研发并推出算力网络应用平台。该系统通过提供一种即开即用、按需付费的零感知算网应用服务&#xff0c;使…

13年老鸟整理,自动化测试落地实施方案总结,看这篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 一般来说&#xf…

RK平台计算GPIO对应的整型数

GPIO是比较常用的资源&#xff0c;比如说控制LED灯亮灭&#xff0c;控制LCD上电&#xff0c;控制模块的复位电路&#xff0c;做外设的中断脚等等&#xff0c;这些都有对GPIO的操作和使用&#xff0c;所以说&#xff0c;GPIO开发是驱动开发中必不可少的操作&#xff0c;而且也是…

如何轻松拿捏LIO-SAM?

LOAM是目前为止激光里程计(LO)领域最经典最广泛使用的方法&#xff0c;堪称LO领域的baseline&#xff0c;至今仍在KITTI数据集上名列前茅。但是它存在诸多问题&#xff0c;比如&#xff1a;它直接存储全局体素地图而不是局部地图&#xff0c;从而很难执行回环检测以修正漂移&am…

任务管理器的 top

文章目录 任务管理器的 top常规使用显示完整命令设置信息更新次数设置信息更新时间显示指定的进程信息指定用户的进程信息更多信息 任务管理器的 top top命令比较像Windows里面的任务管理器&#xff0c;提供一个动态实时的系统状态检测&#xff0c;可以检测实时显示内存、CPU、…