数据结构课程设计《稀疏矩阵运算器》

最近正在弄数据结构课程设计内容,说实话,感觉自己数据结构学的就是渣,好多东西都不会。还是要多学点东西啊。现在暂且贴点之前写完的东西吧,到时候也好有个总结。

 

1 诸论


1.1 问题描述

      稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算准备效率。实现一个能进行稀疏矩阵基本运算的运算器。

1.2 基本要求

      以“带行逻辑链接信息”的三元组顺序表示稀疏矩阵,实现两个稀疏矩阵相加、相减、相乘和求逆的运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。

 

2 分析问题和确定解决方案


2.1 问题描述

      稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算准备效率。实现一个能进行稀疏矩阵基本运算的运算器。

2.2 输入输出

2.2.1 输入形式及输入值范围

      以三元组的形式输入,首先应输入稀疏矩阵的行数、列数和非零元个数,控制好矩阵大小。其次分别输入非零元对应的行列和数值。

      例如:输入3 3 4分别代表稀疏矩阵的行数、列数和非零元个数

      其后分别输入:1 1 3

                           3 3 5

                           2 2 7

                           2 3 9

      代表稀疏矩阵非零元对应位置及数值,及建立的稀疏矩阵为: clip_image002

      在输入非零元时,应判别给出的数据是否在矩阵的行列范围内,以及是否非零元有重复输入现象。若重复输入非零元后,应判断如何取舍和处理错误带来需要重新计数的情况。对手动输入和文件读入两种方式应采取不同的方式进行输入操作。

2.2.2 输出形式

       运算结果通常以阵列形式输出。

2.3 矩阵各功能实现

2.3.1 矩阵相加运算

      通过对两矩阵行行列列对应相加,实现矩阵加法运算。通常的矩阵加法被定义在两个相同大小的矩阵。两个m×n矩阵A和B的和,标记为A+B,一样是个m×n矩阵,其内的各元素为其相对应元素相加后的值。例如:

clip_image003

2.3.2 矩阵相减运算

      矩阵减法可将其中一个矩阵非零元全部取负,再进行矩阵加法。所以,矩阵减法和加法本质是一致的。A-B内的各元素为其相对应元素相减后的值,且此矩阵会和A、B有相同大小。例如:

clip_image004

2.3.3 矩阵相乘运算

      矩阵相乘运算可由一般矩阵相乘的定义进行运算,即一矩阵的行元素乘以另一矩阵的列元素。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有定义。

      例如当A是个4×2矩阵和B是个2×3矩阵时。分别来自两个矩阵的元素都依箭头方向而两两配对,把每一对中的两个元素相乘,再把这些乘积加总起来,最后得到的值即为箭头相交位置的值。

clip_image006clip_image009

2.3.4 矩阵求逆矩阵运算

(空)

2.1 课程设计目的

      (1)了解稀疏矩阵的相关应用。

      (2)掌握稀疏矩阵存储、创建、显示、转置等方法。

      (3)实现一个能进行稀疏矩阵基本运算的运算器。

2.2 课程设计意义

      本次课程设计可以使我们更熟练地掌握稀疏矩阵的相关知识,利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算准备效率。

      本次课程设计是本组成员共同努力而完成的,第一次进行课程设计是我们的探索过程,这个过程中,我们克服了一个个困难,在摸索中前行,我们相信通过此次课程设计我们每个人都会对数据结构这门课程有更深一步的了解。

2.3 模块及任务分配

2.3.1 建立并初始化稀疏矩阵及程序输出、连接各个子函数

      本模块要求以三元组表形式存储方式建立稀疏矩阵并进行初始化。在以三元组表存储方式建立稀疏矩阵时,应考虑到手动输入及文件读入两种不同情况下矩阵越界及其他错误的情况,做好对初始化矩阵的检查,这样可以保证之后的运算能顺利进行。

2.3.2 进行稀疏矩阵相加、减运算

      本模块要求设计函数进行稀疏矩阵的加减运算。在编写函数时,要先输入两个稀疏矩阵才能进行下一步的运算。减法运算中,只要将其中一个矩阵的非零元变为负数,即可进行矩阵加法运算,所以,矩阵加法运算是本模块核心。在矩阵加法运算中,需要判断两矩阵类型是否符合相加条件。

2.3.3 进行稀疏矩阵乘法运算

      本模块要求设计函数对两个矩阵进行乘法运算。在运算中,需要判断两矩阵是否符合相乘条件,即一矩阵行数是否等于另一矩阵的列数。

2.3.4 进行稀疏矩阵求逆矩阵运算

      本模块要求设计函数对矩阵进行求其逆矩阵的运算。在求逆矩阵中,应考虑到运算过程中中间结果可能不是整数,所以三元组表中存储的数据类型应为单精度或双精度型。求逆矩阵应先判断其运算成立条件,并进行相应运算。打印结果时,也应注意数据类型为单精度或双精度。

2.3.5 任务分配

(空)

 

3 分析问题和确定解决方案


(空)

 

代码部分


Matrix.h

#include <stdio.h>
#include <stdlib.h>
#define Max 5000
/*以三元组表为存储方式定义的稀疏矩阵*/
typedef struct   //以三元组表存储方式存储稀疏矩阵的非零元数据
{
    int row, col;   //非零元行列值
    int data;   //非零元数值
} triple;

typedef struct
{
    int line, list, element;  //稀疏矩阵的行列及非零元个数
    triple data[Max];    //以三元组表形式存储稀疏矩阵非零元对应行列以及数值
} matrix;

typedef struct
{
    int row;
    int col;
    float data;   //稀疏矩阵用float型扩大精度,用于计算逆矩阵
} triple_f;

typedef struct
{
    int line, list, element;
    triple_f data[Max];
} matrix_f;

/*函数声明*/
/*main.cpp*/
matrix *Init();    //初始化矩阵Matrix
matrix_f *Init_f();    //初始化矩阵Matrix_f
/*Print_line.cpp*/
extern void Print_line();    //打印横线

/*Print_menu.cpp*/
extern void Print_menu();    //打印菜单

/*Print_Matrix.cpp*/
extern void Print_Matrix();    //打印稀疏矩阵Matrix
extern void Print_Matrix_f();    //打印稀疏矩阵Matrix_f

/*Creat_Matrix.cpp*/
extern void Creat_Matrix(matrix **);    //创建稀疏矩阵Matrix
extern void Creat_Matrix_f(matrix_f **);    //创建稀疏矩阵Matrix_f

/*Print_Matrix.cpp*/
extern void Print_Matrix(matrix *);    //打印稀疏矩阵Matrix
extern void Print_Matrix_f(matrix_f *);    //打印稀疏矩阵Matrix_f

/*Matrix_addition_subtraction.cpp*/
extern void Matrix_addition(matrix *, matrix *, matrix **);    //稀疏矩阵加法运算
extern void Matrix_subtraction(matrix *, matrix *, matrix **);    /
  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include #define maxsize 100 typedef struct { int i,j; //该非零元的行和列 int v; //该非零元的值 }triple; typedef struct { triple data[maxsize]; //非零元三元组表,data[0]未用 int rpos[maxsize]; int m,n,t; //矩阵的行数,列数和非零元个数 }tripletable; void convert() //矩阵的转置 { int k; tripletable A,B; printf("输入稀疏矩阵A的行数,列数和非零元个数:"); scanf("%d %d %d",&A.m,&A.n,&A.t); for(k=1;k<=A.t;k++) { printf("输入第%d个非0元素的行数,列数和值:",k); scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].v); } B.m=A.m;B.n=A.n;B.t=A.t; if(B.t) { int p; int q=1,col; for(col=1;col<=A.n;++col) { for(p=1;p<=A.t;++p) { if(A.data[p].j==col) { B.data[q].i=A.data[p].j; B.data[q].j=A.data[p].i; B.data[q].v=A.data[p].v; ++q; } } } int shuru[100][100]={0}; for(k=1;k<=B.t;k++) { shuru[B.data[k].j][B.data[k].i]=B.data[k].v; } printf("输入为:\n"); for(k=1;k<=B.m;k++) { int l; for(l=1;l<=B.n;l++) printf("%d ",shuru[k][l]); printf("\n"); } int result[100][100]={0}; for(k=1;k<=B.t;k++) { result[B.data[k].i][B.data[k].j]=B.data[k].v; } printf("结果为:\n"); for(k=1;k<=B.n;k++) { int l; for(l=1;l<=B.m;l++) printf("%d ",result[k][l]); printf("\n"); } } } void add() //矩阵的加法 { int k; tripletable A,B; printf("输入稀疏矩阵A的行数,列数和非零元个数:"); scanf("%d %d %d",&A.m,&A.n,&A.t); for(k=1;k<=A.t;k++) { printf("输入第%d个非0元素的行数,列数和值:",k); scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].v); } printf("输入稀疏矩阵B的行数,列数和非零元个数:"); scanf("%d %d %d",&B.m,&B.n,&B.t); for(k=1;k<=B.t;k++) { printf("输入第%d个非0元素的行数,列数和值:",k); scanf("%d %d %d",&B.data[k].i,&B.data[k].j,&B.data[k].v); } if(A.m!=B.m||A.n!=B.n) { printf("输入错误:A与B的行数或列数不相同,请重新输入\n"); return; } int a[100][100]={0}; for(k=1;k<=A.t;k++) { a[A.data[k].i][A.data[k].j]=A.data[k].v; } printf("A输入为:\n"); for(k=1;k<=A.m;k++) { int l; for(l=1;l<=A.n;l++) printf("%d ",a[k][l]); printf("\n")

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值