用三元组存储稀疏矩阵,实现其快速转置及矩阵相乘

用三元组存储稀疏矩阵,实现其快速转置及矩阵相乘

一、明确问题

用三元组存储稀疏矩阵,实现其快速转置及矩阵相乘。

二、问题分析

该问题分为三个小部分:1、将一个矩阵转换为三元数组;2、把三元数组转置;3、判断输入的两个矩阵是否能够相乘,若能则用三元数组完成矩阵相乘。
问题1:需要创建一个动态数组,根据输入的i,j来判断该数组的行和列。通过双层for循环完成数组的赋值即矩阵的创建。转换成三元数组即是创建一个结构体包含矩阵的行数、列数以及非零元个数,同时嵌套一个结构体用于存储每一个非零值的行、列和具体值。
问题2:三元数组的转置,首先是需要将三元数组的行列互换,其次是按照列的大小顺序重新排序。创建了一个cpot数组用于计算每一列的非零值的个数,按照cpot数组的值来用于转置矩阵的排序。
问题3:两矩阵相乘,首先判断第一个矩阵的列数和第二个矩阵的行数,只有其相等才能相乘。通过矩阵相乘的公式,并按照c语言的写法,将子函数写出来。即将一矩阵的列值和二矩阵行值相等的值相乘,若不止一个非零值,则将其相加。

三、主要函数和伪代码

创建一个结构体JD,保存非零值得行数i、列数j和具体值e。
struct JD{
int i,j;
int e;
};
创建一个结构体,包含一个含MAX+1个JD结构体的部分,(用MAX+1是为了从1开始,便于之后的计算),也包含三个整型变量,存储原矩阵行数mu,列数ru和非零元tu的个数。
struct matrix{
struct JD data[MAX+1];//想从1开始!!!
int mu,ru,tu;//矩阵的行数、列数和非零元个数
};
创建了5个子函数,用于模块化代码,并且简洁代码。
void transmatrix(struct matrix M,struct matrix T);该函数用于将一个用三元数组存储的矩阵M转置,并用另一个三元数组T存储。
void printmartix(struct matrix M);将三元矩阵M按照行列从小到大的顺序打印出来。
int
* createarray(int i,int j);//创建一个i行j列的二维数组,该函数返回二维数组的首地址。
void MultSMatrix(struct matrix O,struct matrix P,struct matrix *R );//计算两个用三元数组存储的矩阵O、P相乘后的值,用结构体R来存储
void initialize(struct matrix *M,int i,int j,int **a);该函数用于矩阵初始化,即将一个正常矩阵a转化为用三元数组M存储。

四、源代码和运行结果

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX  100//设置矩阵最大可容纳的非零值为100 
struct JD{
   
	int i,j;
	int e;
};

struct matrix{
   
	struct JD data[MAX+1];//想从1开始!!! 
	int mu,ru,tu;//矩阵的行数、列数和非零元个数 
};

void transmatrix(struct matrix M,struct matrix *T);//把矩阵转置 
void printmartix(struct matrix M);//把矩阵打印下来 
int** createarray(int i,int j);//创建一个i行j列的二维数组 
void MultSMatrix(struct matrix O,struct matrix P,struct matrix *R );//计算两个矩阵的值 
void initialize(struct matrix *M,int i,int j,int **a);

int** createarray(int i,int j){
   
	 int** a;
	 int m,n,k;
	a =(int**)malloc(i*sizeof(int*)); 
    for(k=0;k<i;k++)
    a[k]=(int*)malloc(j*sizeof(int));
         
 	for(m=0;m<i;m++){
   
 		for(n=0;n<j;n++){
   
 			scanf("%d",&a[m
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值