稀疏矩阵(三元组)的创建,转置,遍历,加法,减法,乘法。C实现

这篇具有很好参考价值的文章主要介绍了稀疏矩阵(三元组)的创建,转置,遍历,加法,减法,乘法。C实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、思路。

1.创建。

可以直接赋值字符串,但是为0的元素也要依次赋值,比较麻烦,但是容易理解也能实现。

其次也可以构思三元组赋值,只赋值非零元素和它的行,列数,在打印时进行if判断,没有赋值的就输出0,这样比较简单。

创建结构体时,一个矩阵需要有它的行总数和列总数,并且针对三元组,你还需要每个元素所在的行和列,还有这个三元组的非零元素总和。

2.遍历。

对于三元组,它包括非零元素集合和零元素集合,针对于非零元素的行,列数,进行双重for循环,如果非零元素的行,列数与for循环中的变量相等,就输出这个数的值,否则就输出0。

3.转置。

转置就是把行号和列号互换,如果按行先序的话,时间复杂度过高,所以一般都采用列先序。

  • 首先进行 行总数,列总数,以及非零元素总数的赋值。
  • 其次进行按列循环对非零元素的遍历
  • 如果非零元素的列号==外面循环的列号,则进行行,列号的互换。

快速转置法的详解图有点复杂,所以没做,但是代码在下面有,并且运行正常。

4.加法,减法,乘法。

加法非常简单,在A,B两个矩阵中,如果非零元素的位置相同,则新矩阵C这个位置的值就=A,B的值相加,如果不相同则矩阵C的值就等于A的值或者B的值。

减法就是加上矩阵*-1

  乘法如果相等就相乘,不相等就不用管,因为就算管了最后也为0;

二、具体代码。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define false 0
#define true 1
#define max 100
typedef struct {
	int value;    //value为具体数值 
	int row,col;  //row为行,col为列 
}Array;
typedef struct {
	Array data[max+1];    
	int rows,cols,nums;   //nums为非零元素个数 
}Arrays;
//创建稀疏矩阵 
int InitArray(Arrays *L,int rows,int cols,int nums){
	int i,j;
	L->nums=nums;
	L->cols=cols;
	L->rows=rows;
	assert(L->nums<max);
	printf("-------------\n");
	printf("请依次输入非零元素的行数,列数,值:\n");
	for (int i = 1; i <= L->nums; i++) {
		scanf("%d %d %d", &L->data[i].row, &L->data[i].col, &L->data[i].value);
		}
		printf("创建成功!\n");
		return true;
	}
//遍历输出稀疏矩阵  三元组形式
void bianli1(Arrays *L) {
	printf("-------------三元组形式形式遍历输出:\n");
	for (int i = 1; i <= L->rows; i++) {
		printf("%d行%d列%d \n",L->data[i].row,L->data[i].col,L->data[i].value);
	}
}

//遍历输出稀疏矩阵  矩阵形式
void bianli2(Arrays *L) {
	int flag = 1;         //flag代表 
	for (int i = 1; i <= L->rows; i++) {
		for (int j = 1; j <=L->cols; j++) {
			if (L->data[flag].value!=0&&L->data[flag].row==i&&L->data[flag].col==j) {
				printf(" %d", L->data[flag].value);
				flag++;
			}
			else {
				printf(" 0");
			}
		}
		printf("\n");
	}
}
//矩阵普通转置(按列)
int Transform(Arrays a,Arrays *b){   // //a为原矩阵,b为转置后的矩阵
	b->cols=a.cols;
	b->nums=a.nums;
	b->rows=a.rows;
	if(b->nums>0){
		int j=1;
		for(int k=1;k<=a.cols;k++){
			for(int i=1;i<=a.nums;i++){    //进入非零元素循环 
				if(a.data[i].col==k){      //如果在每一个列中有非零元素,则进行转置操作 
					b->data[j].row=a.data[i].col;    //j代表表B的非零元素个数值,它从1开始。 
					b->data[j].col=a.data[i].row;
					b->data[j].value=a.data[i].value;
					j++;
					if(j>a.nums) return false;
				}
			} 
		}
	}
} 
//矩阵快速转置
void FastTransform(Arrays *a,Arrays *b){   //a为原矩阵,b为转置后的矩阵 
	int num[max],position[max];
	int col,i,k,m;
	b->cols=a->cols;
	b->nums=a->nums;
	b->rows=a->rows;
	if(b->nums>0){
		for(col=1;col<=a->cols;col++){   //首先将num数组的数值都赋值为0 
			num[col]=0;
		}
		for(i=1;i<=a->nums;i++){   //再遍历非零元素,把非零元素的列所在的num数组进行++操作 
			num[a->data[i].col]++;
		} 
		position[1]=1;     //第一个非零元素的position值定义为1 
	 	for(col=2;col<=a->cols;col++){
		position[col]=position[col-1]+num[col-1];   //前一列非零元素的起始位置加非零元素的个数等于后一列的起始位置 
		}
		for(k=1;k<=a->nums;k++){   //对非零元素进行遍历并依次转置 
			col=a->data[k].col; 
			m=position[col];
			b->data[m].row=a->data[k].col;
			b->data[m].col=a->data[k].row;
			b->data[m].value=a->data[k].value;
			position[col]++;
		} 
	}
} 
//矩阵加法
int ADD(Arrays a,Arrays b,Arrays *c){
	int k=1,i,j;      //i为a的元素数目,j为b的元素数目,k为c的元素数目 
	
	//同行同列的才能相加 
	if(a.cols!=b.cols||a.rows!=b.rows){
		return false;
	}
	
	c->cols=a.cols;   //赋值总行数,总列数 
	c->rows=a.rows;
	//进行遍历赋值 
	for(i=1,j=1;i<=a.nums&&j<=b.nums;){
	   
	   //B的行号大于A直接将A中元素加入C矩阵 
		if(a.data[i].row<b.data[j].row){
			c->data[k].col=a.data[i].col;
			c->data[k].row=a.data[i].row;
			c->data[k].value=a.data[i].value;
			k++;       //C元素向后增一位 
			i++;       //a赋值则a元素向后增一位,如果时b则b元素向后增一位 
		}
		//B的行号小于A直接将B中元素加入C矩阵
		else if(a.data[i].row>b.data[j].row){
			c->data[k].col=b.data[j].col;
			c->data[k].row=b.data[j].row;
			c->data[k].value=b.data[j].value;
			k++;
			j++; 
		}else{  //行号相同 
			
			//B的列号小于A直接将B中元素加入C矩阵
			if(a.data[i].col>b.data[j].col) {
			c->data[k].col=b.data[j].col;
			c->data[k].row=b.data[j].row;
			c->data[k].value=b.data[j].value;
			k++;
			j++;
			}
			
			//B的列号大于A直接将A中元素加入C矩
			else if(a.data[i].col<b.data[j].col){
			c->data[k].col=a.data[i].col;
			c->data[k].row=a.data[i].row;
			c->data[k].value=a.data[i].value;
			k++;
			i++;
			}
			//相等 
			else {
				 
				c->data[k].col=a.data[i].col;
				c->data[k].row=a.data[i].row;
				c->data[k].value=a.data[i].value+b.data[j].value;
				k++;
				i++;
				j++;
			}
		}
	}
	while(i<=a.nums){ //B取完A未取完
	
			//将A中所剩元素依次加入到C中
		c->data[k].col=a.data[i].col;
		c->data[k].row=a.data[i].row;
		c->data[k].value=a.data[i].value;
		k++;
		i++;
	}   
	while(j<=b.nums){  //A取完B未取完
			
			//将A中所剩元素依次加入到C中
		c->data[k].col=b.data[j].col;
		c->data[k].row=b.data[j].row;
		c->data[k].value=b.data[j].value;
		k++;
		j++;
	}
}
    
			


//矩阵减法
int reduce(Arrays a,Arrays b,Arrays *c){   //调用加法操作,在b矩阵基础上乘 -1 在加 a矩阵 
	for(int i=1;i<=b.nums;i++){
		b.data[i].value=b.data[i].value*-1;
	}
	ADD(a,b,c);
} 
//矩阵乘法
int multipe(Arrays a,Arrays b,Arrays *c){
	int m=1,n=1,k=1;      //m为a的元素数目,n为b的元素数目,k为c的元素数目 
	if(a.cols!=b.cols||a.rows!=b.rows){
		return false;
	}
	c->cols=a.cols;
	c->rows=a.rows;
	while(m<=a.nums&&n<=b.nums){
		if(a.data[m].col==b.data[n].col&&a.data[m].row==b.data[n].row){
			c->data[k].col=a.data[m].col;
			c->data[k].row=a.data[m].row;
			c->data[k].value=a.data[m].value*b.data[n].value;
		}
		m++;n++;k++;
	}
} 
int main(){
	Arrays s;
	Arrays s1;
	Arrays s2;
	Arrays s3;
	int row, col, num;
	//创建
	printf("请依次输入稀疏矩阵A的行数,列数,非零元个数(用空格隔开):\n");
	scanf("%d %d %d", &row, &col, &num);
	InitArray(&s,row,col,num);
	bianli2(&s);
	printf("请依次输入稀疏矩阵B的行数,列数,非零元个数(用空格隔开):\n");
	scanf("%d %d %d", &row, &col, &num);
	InitArray(&s1,row,col,num);
	bianli2(&s1);
	printf("---------矩阵B的转置为:\n");
	Transform(s1,&s3);
	bianli2(&s3);
	printf("---------矩阵相乘为:\n"); 
	multipe(s,s1,&s2);
	bianli2(&s2);
	printf("---------矩阵相加为:\n"); 
	ADD(s,s1,&s2);
	bianli2(&s2);
	printf("---------矩阵相减为:\n");
	reduce(s,s1,&s2); 
	bianli2(&s2);
}

三、实现结果。

稀疏矩阵(三元组)的创建,转置,遍历,加法,减法,乘法。C实现

 稀疏矩阵(三元组)的创建,转置,遍历,加法,减法,乘法。C实现

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

到了这里,关于稀疏矩阵(三元组)的创建,转置,遍历,加法,减法,乘法。C实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 稀疏矩阵的三元组存储及快速转置

    目录 问题描述  完整代码  详细分析 本节文章 【问题描述】 实现稀疏矩阵的三元组表存储和快速转置运算。 【输入形式】 输入一个整型的6阶稀疏矩阵。 【输出形式】 输出稀疏矩阵的三元组表形式,使用快速转置方法进行转置运算,输出辅助数组num和cpot的值及转置后的三

    2023年04月26日
    浏览(36)
  • 通过类实现矩阵加减法、乘法、转置(C++))

    定义一个二维方阵类 matrix 通过重载二元运算符“+”、“-”、“*”和一元运算符“~”, 来实现矩阵加、矩阵减、矩阵乘以及矩阵转置。 1.由于矩阵的行与列都是未知的,首先需要通过 动态分配内存 实现创建任意大小的矩阵,由于类中默认的构造函数无法满足我们的需求,

    2024年02月06日
    浏览(56)
  • PTA:三元组顺序表表示的稀疏矩阵转置Ⅱ

    三元组顺序表表示的稀疏矩阵转置Ⅱ。设a和b为三元组顺序表变量,分别表示矩阵M和T。要求按照a中三元组的次序进行转置,并将转置后的三元组置入b中恰当的位置。 输入第1行为矩阵行数m、列数n及非零元素个数t。 按行优先顺序依次输入t行,每行3个数,分别表示非零元素

    2024年02月06日
    浏览(38)
  • 数据结构·练习·三元组表法实现稀疏矩阵的转置

    一、问题描述 一个mxn的矩阵A,它的转置矩阵B是一个nxm矩阵,且A[i][j]=B[j][i],0=i=m-1,0=j=n-1,即A的行是B的列,A的列是B的行。 用三元组表对稀疏矩阵进行压缩存储,再进行时间复杂度O(n)的快速转置,最后输出稀疏矩阵。 其中m=4,n=5 二、算法概述 1、问题分析 1)压缩 2)转置

    2024年02月04日
    浏览(43)
  • 数组:矩阵快速转置 矩阵相加 三元组顺序表/三元矩阵 随机生成稀疏矩阵 压缩矩阵【C语言,数据结构】(内含源代码)

    目录 题目: 题目分析: 概要设计: 二维矩阵数据结构: 三元数组三元顺序表顺序表结构: 详细设计: 三元矩阵相加: 三元矩阵快速转置: 调试分析: 用户手册: 测试结果:  源代码: 主程序:  头文件SparseMatrix.h:  头文件Triple.h: 总结: 稀疏矩阵A,B均采用 三元组

    2023年04月26日
    浏览(60)
  • 【数据结构】稀疏矩阵存储的三种方法及三元组表示稀疏矩阵转置算法的两种实现 —— C++

    1. 三元组顺序表数据结构 注意:data[]中的元素是按行存储或者按列存储的,所以 在将三元组逆置时,不能简单地将行列下标对换,data[]数组中元素的顺序也需要重新排列 2. 三元组表示稀疏矩阵转置算法1 3. 三元组表示稀疏矩阵转置算法2:快速转置 为了 便于随机存取任意一

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

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

    2024年02月03日
    浏览(42)
  • 大数运算(加法,减法,乘法,除法)

    目录 一.大数加法 1.题目描述 2.问题分析 3.代码实现 二.大数减法 1.题目描述 2.问题分析 3.代码实现 三.大数乘法 1.题目描述 2.问题分析 3.代码实现 四.大数除法 1.题目描述 2.问题分析 3.代码实现 以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。

    2024年02月07日
    浏览(44)
  • 高精度加法,减法,乘法,除法(下)(C语言)

    前言 上一篇博客我们分享了高精度加法,减法,这一期我将为大家讲解高精度乘法和高精度除法。那让我们开始吧! 对加法和减法感兴趣的话就点我 让我们想想我们平时做数学时遇见乘法是怎么做的。以下图为例。 高精度乘法也是这样的一个思路,首先我们先把a和b的值储存

    2024年02月04日
    浏览(66)
  • 高精度加法,减法,乘法,除法(上)(C语言)

    前言 本篇内容介绍加法和减法,如果想看乘法和除法就点这里-高精度乘法,除法 加,减,乘,除这些运算我们自然信手捏来,就拿加法来说,我们要用c语言编程算a+b的和,只需让sum = a+b即可,可是这是局限的,我们都知道int的表示的最大值为2147483647(32位和64位机器)。但

    2024年02月03日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包