利用三元组存储的稀疏矩阵的转置(列序递增与快速定位)

本文介绍了如何在C++中使用列序递增转置法和一次快速重定位算法对矩阵进行转置操作,包括定义结构体、矩阵操作函数和main函数的示例。
摘要由CSDN通过智能技术生成
#include<bits/stdc++.h>
using namespace std;
#define maxsize 50
typedef int eletype;
typedef struct{
	int line;//行值 
	int column;//列值 
	eletype value;//节点数值 
}Nodes;//单个节点的定义 
typedef struct{
	Nodes node[maxsize];
	int num;//三元组含节点个数 
	int linenum;//三元组行总数 
	int columnnum;//三元组列总数 
}trmatrix;//三元组定义 
//普通转置法

//void zhuanzhi1(eletype a[][],eletype b[][]){
//	for(int i =0;i<m;i++)
//	{
//		for(int j=0;j<n;j++)
//		{
//			b[i][j]=a[j][i];
//		}
//	}
//} 


//列序递增转置法 (原理是用position数组记录每一行第一个元素位置) 
bool zhuanzhi(trmatrix a,trmatrix *b){
	int i,j,k;
	b->linenum=a.columnnum;
	b->columnnum=a.linenum;
	b->num=a.num;
	if(b->num>0){
		j=0;
		for(k=1;k<=a.columnnum;k++)
		{
			for(i=0;i<a.num;i++)
			{
				if(a.node[i].column==k){
					b->node[j].line=a.node[i].column;
					b->node[j].column=a.node[i].line;
					b->node[j].value=a.node[i].value;
					j++;					
				}
			}
		}
	}
}
//一次快速重定位
void fasttsmatrix(trmatrix a,trmatrix *b){
	int col,t,p,q;
	int num[maxsize],position[maxsize];
	b->num=a.num;b->columnnum=a.linenum;b->linenum=a.columnnum;
	if(b->num>0){
		
		for(col=1;col<=a.columnnum;col++){
			num[col]=0;
		}
		for(t=0;t<a.num;t++){
			num[a.node[t].column]++;
		}
		position[1]=0;
		for(col=2;col<=a.columnnum;col++){
			position[col]=position[col-1]+num[col];
		}
		for(p=0;p<a.num;p++){
			col=a.node[p].column;q=position[col];
			b->node[q].value=a.node[p].value;
			b->node[q].column=a.node[p].line;
			b->node[q].line=a.node[p].column;
			position[col]++;
		}
	}
} 

//打印矩阵 
void prints(trmatrix a){
	for(int i=0;i<a.num;i++){
		cout<<"row:"<<" "<<a.node[i].line<<" "<<"col"<<" "<<a.node[i].column<<" "
		<<"value"<<" "<<a.node[i].value<<endl; 
	}
}
int main()
{
	trmatrix a,c,d;
	trmatrix *b=&c;
	
	a.linenum=3;a.columnnum=4;
	a.num=12;
	int count=0;
	for(int i=0;i<3;i++)
		for(int j=0;j<4;j++){
			a.node[count].line=i+1;
			a.node[count].column=j+1;
			a.node[count].value=i*4+j+1;
			count++;
		}
		prints(a); 
		cout<<endl;
		
		
		zhuanzhi(a,b);//列序递增转置 
		prints(*b); 
		cout<<endl;
		
		b=&d;
		fasttsmatrix(a,b);//一次快速重定位转置 
		prints(*b);

	
}

运行结果如下

欢迎参考学习 批评指正

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是三元组存储稀疏矩阵快速转置的C语言实现算法: ```c #include <stdio.h> #include <stdlib.h> #define MAXSIZE 1000 // 定义三元组最大元素个数 // 三元组结构体 typedef struct { int i, j, e; // 行下标、列下标、元素值 } Triple; // 稀疏矩阵结构体 typedef struct { Triple data[MAXSIZE + 1]; // 三元组表,data[0]未用 int mu, nu, tu; // 行数、列数、非零元素个数 } Matrix; // 稀疏矩阵转置 void Transpose(Matrix M, Matrix *T) { int p, q, col; int num[M.nu + 1]; int cpot[M.nu + 1]; T->mu = M.nu; T->nu = M.mu; T->tu = M.tu; if (T->tu) { for (col = 1; col <= M.nu; ++col) num[col] = 0; for (p = 1; p <= M.tu; ++p) ++num[M.data[p].j]; cpot[1] = 1; for (col = 2; col <= M.nu; ++col) cpot[col] = cpot[col - 1] + num[col - 1]; for (p = 1; p <= M.tu; ++p) { col = M.data[p].j; q = cpot[col]; T->data[q].i = M.data[p].j; T->data[q].j = M.data[p].i; T->data[q].e = M.data[p].e; ++cpot[col]; } } } int main() { Matrix M, T; int i, j, k; printf("请输入稀疏矩阵的行数、列数和非零元素个数:"); scanf("%d%d%d", &M.mu, &M.nu, &M.tu); printf("请输入稀疏矩阵三元组表:\n"); for (k = 1; k <= M.tu; ++k) { scanf("%d%d%d", &M.data[k].i, &M.data[k].j, &M.data[k].e); } Transpose(M, &T); printf("转置后的稀疏矩阵三元组表为:\n"); for (k = 1; k <= T.tu; ++k) { printf("%d %d %d\n", T.data[k].i, T.data[k].j, T.data[k].e); } return 0; } ``` 算法思路: - 遍历原稀疏矩阵中每个非零元素,统计每列非零元素个数并存储在num数组中。 - 根据num数组计算每列第一个非零元素在转置后的三元组表中的位置并存储在cpot数组中。 - 遍历原稀疏矩阵中每个非零元素,将其转置存储转置后的三元组表中。由于转置后的三元组表是按列存储的,因此要先按列顺序遍历,再按行顺序存储
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值