稀疏矩阵的表示以及转置

这篇具有很好参考价值的文章主要介绍了稀疏矩阵的表示以及转置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.稀疏矩阵概念

2.三元组表

3.稀疏矩阵的转置

 4.题目实现


1.稀疏矩阵概念

矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵。

图示:

稀疏矩阵的转置矩阵,矩阵,线性代数,算法

 文章来源地址https://www.toymoban.com/news/detail-782472.html

2.三元组表

在存储稀疏矩阵时,为了节省存储单元,很自然地想到使用压缩存储方法。但由于非零元素的分布一般是没有规律的,因此在存储非零元素的同时,还必须同时记下它所在的行和列的位置(i,j)。反之,一个三元组(i,j,aij)唯一确定了矩阵A的一个非零元。因此,稀疏矩阵可由表示非零元的三元组及其行列数唯一确定

若把稀疏矩阵中的三元组线性表按顺序储存结构储存,则称为三元组顺序表,简称为三元组表。

下图即为转化:

稀疏矩阵的转置矩阵,矩阵,线性代数,算法

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

#define M //稀疏矩阵行数
#define N //稀疏矩阵列数
#define MAX //稀疏矩阵中非零元最多的个数
typedef int Elem;
typedef struct 
{
	int r;//行号 
	int c;//列号 
	Elem d;//元素值 
}TupNode;

typedef struct
{
	int rows;//行数
	int cols;//列数
	int nums;//非零元素个数
	TupNode data[MAX]; 
}TSMat;

3.稀疏矩阵的转置

  1.一个m×n的矩阵A,它的转置B是一个n×m的矩阵,且a[i][j]=b[j][i],0≦i≦m,0≦j≦n,即A的行是B的列,A的列是B的行
  2. 将A转置为B,就是将A的三元组表a.data置换为表B的三元组表b.data,如果只是简单地交换a.data中i和j的内容,那么得到的b.data将是一个按列优先顺序存储的稀疏矩阵B,要得到按行优先顺序存储的b.data,就必须重新排列三元组的顺序。
       由于A的列是B的行,因此,按a.data的列序转置,所得到的转置矩阵B的三元组表b.data必定是按行优先存放的
核心思想:行列互换。

解决思路:
1.将矩阵行、列维数互换;
2.将每个三元组中的i和j相互调换;
3. 重排三元组次序,使B中元素以N的行(M的列)为主序。

A原矩阵三元组表                                                B转置后的三元组表

稀疏矩阵的转置矩阵,矩阵,线性代数,算法稀疏矩阵的转置矩阵,矩阵,线性代数,算法

 显然发现行列互换,对A中的列又1到7循环查找,然后放入B中的行。

矩阵转置的实现思路是:不断遍历存储矩阵的三元组表,每次都取出表中 j 列最小的那一个三元组,互换行标和列标的值,并按次序存储到一个新三元组表中,。

例如,将图 2a) 三元组表存储的矩阵进行转置的过程为:

  1. 新建一个三元组表(用于存储转置矩阵),并将原矩阵的行数和列数互换赋值给新三元组;
  2. 遍历三元组表,找到表中 j 列最小值 1 所在的三元组 (3,1,6),然后将其行标和列标互换后添加到一个新的三元组表中,如图 3所示:稀疏矩阵的转置矩阵,矩阵,线性代数,算法

 3.继续遍历三元组表,找到表中 j 列次小值为 2 的三元组,分别为 (1,2,1)、(2,2,3) 和 (3,2,5),根据找到它们的先后次序将各自的行标和列标互换后添加到新三元组表中,如图 所示:

稀疏矩阵的转置矩阵,矩阵,线性代数,算法

 代码实现:

void TranMat(TSMat *t,TSMat *tb)//t为A的三元组顺序表,tb为B的三元组顺序表
{
	int k,k1=0,v;                       //k1记录tb中元素个数
	tb->rows=t->cols;tb->cols=t->rows;  //行列互换
    tb->nums=t->nums;
	if(t->nums!=0)                      //当存在非零元时进行转置
	{
		for(v=0;v<t->cols;v++)          //按v=0.1....t.cols循环
		{
			for(k=0;k<t->nums;k++)      //k用于扫描t.data的所有元素
			{
				if(t->data[i].c==v)    //找到一个列号为v的元素
				{
					tb->data[k1].r=t->data[k].c;   //tb的行为t的列
					tb->data[k1].c=t->data[k].r;   //tb的列为t的行
					tb->data[k1].d=t->data[k].d;   //值不变
					k1++;                           //tb中元素的个数增加1.
				}
			}
		}

 4.题目实现

    把给定的二维稀疏矩阵用三元组表表示和存储,并进行稀疏矩阵的转置,输出转置后的稀疏矩阵的三元组表。

假如给定如下二维稀疏矩阵:

3  0  0   1  0  0

0  4  0  0  0   0

5  0  0 2   0  0

代码实现:

#include<stdio.h>
#define M 3
#define N 6
#define MAX 20
typedef int Elem;
typedef struct 
{
	int H;//行号 
	int L;//列号 
	Elem d;//元素值 
}TupNode;

typedef struct
{
	int rows;//行数
	int cols;//列数
	int nums;//非零元素个数
	TupNode data[MAX]; 
}TSMat;

void CreatMat(TSMat *B,Elem A[M][N])
{
	int i,j;
	B->rows =M;B->cols =N;B->nums =0 ;
	for(i=0;i<M;i++)
	{
		for(j=0;j<N;j++)
		{
			if(A[i][j]!=0)
			{
				B->data[B->nums].H=i;
				B->data[B->nums].L=j;
				B->data[B->nums].d=A[i][j];
				B->nums++;
			}
		}
	}
}//把二维稀疏矩阵用三元组表表示

void Print(TSMat *B)
{
	int i;
	if(B->nums<=0)
	{
		return ;
	}
	printf("%d   %d   %d\n",B->rows,B->cols,B->nums);
	printf("---------\n");
	for(i=0;i<B->nums;i++)
	{
		printf("%d   %d   %d\n",B->data[i].H,B->data[i].L,B->data[i].d);
	}
}//三元组表的输出 

void TranMat(TSMat *B,TSMat *b)
{
	int i,j=0,k;
	b->rows=B->cols;b->cols=B->rows;b->nums=B->nums;
	if(B->nums!=0)
	{
		for(k=0;k<B->cols;k++)
		{
			for(i=0;i<B->nums;i++)
			{
				if(B->data[i].L==k)
				{
					b->data[j].H=B->data[i].L;
					b->data[j].L=B->data[i].H;
					b->data[j].d=B->data[i].d;
					j++;
				}
			}
		}
	}
} //稀疏矩阵的转置 

int main()
{
	TSMat B,b;
	int i,j;
	int A[M][N]={{3,0,0,1,0,0},{0,4,0,0,0,0},{5,0,0,2,0,0}};//这里可以可以自己用两个循环语句进行输入
	printf("原来的二维稀疏矩阵为:\n");
	for(i=0;i<M;i++)
	{
		for(j=0;j<N;j++)
		{
			printf("%d  ",A[i][j]);
		}
		printf("\n");
	}
	printf("二维稀疏矩阵用三元组表表示为:\n");
	CreatMat(&B,A);
	Print(&B);
	printf("稀疏矩阵三元组表的转置为:\n");
	TranMat(&B,&b);
	Print(&b);
	return 0;
}

运行结果图片:

稀疏矩阵的转置矩阵,矩阵,线性代数,算法

 

 

到了这里,关于稀疏矩阵的表示以及转置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线性代数:矩阵运算(加减、数乘、乘法、幂、除、转置)

    目录 加减 数乘  矩阵与矩阵相乘  矩阵的幂 矩阵转置  方阵的行列式  方阵的行列式,证明:|AB| = |A| |B|        

    2024年01月22日
    浏览(50)
  • 线性代数中的矩阵分解与稀疏处理

    线性代数是计算机科学、数学、物理等多个领域的基础知识之一,其中矩阵分解和稀疏处理是线性代数中非常重要的两个方面。矩阵分解是指将一个矩阵分解为多个较小的矩阵的过程,这有助于我们更好地理解和解决问题。稀疏处理是指处理那些主要由零组成的矩阵的方法,

    2024年04月15日
    浏览(48)
  • 线性代数 --- LU分解(Gauss消元法的矩阵表示)

                     首先, LU分解实际上就是用矩阵的形式来记录的高斯消元的过程 。其中,对矩阵A进行高斯消元后的结果为矩阵U,是LU分解后的两个三角矩阵中其中之一。U是一个上三角矩阵,U就是上三角矩阵upper triangle的首字母的大写。         高斯消元的每一步都

    2024年02月02日
    浏览(52)
  • 线性代数的学习和整理6:如何表示向量/矩阵? 矩阵就是向量组,矩阵的本质是什么?

    目录 0 参考的知识点和目录 1 向量 1.1 向量的概念 1.2 向量如何表示 1.3 向量/矩阵的优秀表示方法:即向量空间内的有向线段 2 矩阵 2.1 矩阵就是多个列向量的集合/合并( 而不是 +),矩阵就是多个列向量的一种简化书写方式? 2.2 矩阵的加法  =等价于=  向量的加法 2.3 矩阵

    2024年02月07日
    浏览(52)
  • [数据结构(C语言版本)上机实验]稀疏矩阵的三元组顺序表压缩存储以及转置实现(含快速转置)

    实现效果: 1、编写程序任意 输入 一个稀疏矩阵,用 三元组顺序表 压缩存储 稀疏矩阵 。 2、对稀疏矩阵进行 转置 , 输出 转置后的矩阵。 对应《数据结构(C语言版)》 第5章 数组与广义表 实验: 1、 掌握下三角矩阵的输入、输出、压缩存储算法; 2、 理解稀疏矩阵的三元

    2024年02月03日
    浏览(42)
  • 矩阵的转置

    题目: 给你一个二维整数数组 matrix , 返回 matrix 的 转置矩阵 。 示例 1:

    2024年02月12日
    浏览(40)
  • 矩阵的转置T和共轭转置H

    矩阵 G G G 的转置 G T G^T G T 和共轭转置 G H G^H G H 在数学中表示不同的操作: 转置 G T G^T G T : 转置是指将矩阵的行和列互换得到的新矩阵。 对于实数矩阵,转置是指将矩阵中的行变为相应的列。 对于复数矩阵,转置同样是将矩阵中的行变为相应的列。 在转置中,并不改变矩

    2024年02月03日
    浏览(53)
  • pytorch中的矩阵的转置问题

    我在我的pytorch专栏发布了一期pytorch入门之tensor,介绍了torch.tensor()的一些创建方式和常用方法,其中就有矩阵的转置方法----tensor.t()、tensor.transpose()和tensor.permute()。我只是用少量语言和代码介绍了这三种方法的用法,但其中的转置原理没有说清。今天咱们就来絮叨絮叨~ 相信

    2023年04月08日
    浏览(36)
  • 【python】python求解矩阵的转置(详细讲解)

    👉博__主👈:米码收割机 👉技__能👈:C++/Python语言 👉公众号👈:测试开发自动化【获取源码+商业合作】 👉荣__誉👈:阿里云博客专家博主、51CTO技术博主 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 求一个矩阵的转置 示例1: 输入:[[1, 2

    2024年02月06日
    浏览(41)
  • C++数据结构 矩阵的转置、镜像及旋转

    C++ 中的矩阵是一种二维数组,用于存储数值数据。矩阵可以用于存储图像数据,以及科学和工程计算中的数据。 常用于以下场景: 数学运算:矩阵乘法、行列式计算、特征值分解等。 图像处理:图像缩放、旋转、颜色变换等。 矩阵分析:因子分析、主成分分析、协方差分

    2024年02月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包