目的:
编程实现稀疏矩阵的四则运算。
实现:
1. 稀疏矩阵的存储结构采用行逻辑表示的三元组
2.
#define MAXSIZE 12500
#define MAXRC 12500
typedef struct {
int i, j;
int e;
}Triple;
typedef struct {
Triple data[MAXSIZE + 1];
int rpos[MAXRC + 1];
int mu, nu, tu;
}RLSMatrix;
先通过创建mu nu tu的值再根据这些值采用循环输入得到data,之后再通过扫描确定rpos的值则可以完成创建。
通过三元组的形式将非零元对应的行列以及数值存储下来,再由稀疏矩阵结构存下矩阵的行数列数以及非零元个数,即可囊括稀疏矩阵的所有信息。这样就可以以三元组的形式把矩阵非零元素存储下来,节省了存储量的同时便于矩阵运算。
矩阵的加法
根据矩阵的相关知识,两个矩阵相加要求两个矩阵的行数,列数要相等。故需要设置判断是否满足矩阵相加的条件。若满足条件,则进行加法运算。根据矩阵加法法则,得到的新矩阵拥有与原来两矩阵相同的行数和列数,其元素数值则为两矩阵对应位置的元素值之和。矩阵的减法
和加法相同地根据三种情况采用三个循环处理对应的数据,只不过两个都有的情况结果要变为两者之差,N有M没有的情况要改为N元素的相反数,其余相同。则可以得到减法的算法。矩阵的乘法
根据矩阵乘法的理论,在满足M.nu==N.mu的情况下,新矩阵Q(i,j)的值即满足M(i,k)与N(k,j)的所有元素乘积之和。对于稀疏矩阵不需要对满足条件的每个元素都进行乘积,因为两者中若有一个为零则其乘积为零。所以只要在所有非零元中找到满足条件的配对进行相乘,在将乘积进行累加即可得到该位置的元素值。结合rpos可以高效地进行循环查找。
程序代码:
Matrix.h文件
#include<stdio.h>
#define MAXSIZE 12500
#define MAXRC 12500
#define ERROR 0
#define OK 1
typedef struct {
int i, j;
int e;
}Triple;
typedef struct {
Triple data[MAXSIZE + 1];
int rpos[MAXRC + 1];
int mu, nu, tu;
}RLSMatrix;
void CreateMatrix(RLSMatrix *M);
void Initrpos(RLSMatrix *M);
void Printrpos(RLSMatrix M);
int Add(RLSMatrix M, RLSMatrix N, RLSMatrix *sum);
int Minus(RLSMatrix M, RLSMatrix N, RLSMatrix *minus);
int Multi(RLSMatrix M, RLSMatrix N, RLSMatrix *multi);
void PrintMatrix(RLSMatrix M);
Matrix.c文件
#include<stdio.h>
#include"Matrix.h"
void CreateMatrix(RLSMatrix *M) {
printf("请输入矩阵的行数,列数,和非零元个数\n");
scanf("%d%d%d", &M->mu, &M->nu, &M->tu);
if (M->tu > (M->mu)*(M->nu)) { printf("该矩阵不存在!请重新输入!\n"); CreateMatrix(&M); }
int s;
for (s = 1; s <= M->tu; s++) {
printf("请输入第%d非零元所在的行,列,及其数值\n", s);
scanf("%d%d%d", &M->data[s].i, &M->data[s].j, &M->data[s].e);
if (M->data[s].i < 0) { printf("行数须为正数!\n"); s -= 1; continue; }
if(M->data[s].j < 0) { printf("列数须为正数!\n"); s -= 1; continue; }
if(M->data[s].e==0){ pri