数据结构课程设计报告--稀疏矩阵运算器

合集下载

稀疏矩阵运算器实验报告

稀疏矩阵运算器实验报告
Ne=&N.data[N.tu]; // Ne指向矩阵N的非零元素尾地址
Qh=Qe=Q.data; // Qh、Qe的初值指向矩阵Q的非零元素首地址的前一地址
while(Mp<=Me&&Np<=Ne)
{
Qe++;
switch(comp(Mp->i,Np->i))
{
case 1: *Qe=*Mp;
Mp++;
while(Mp<=Me)
{
Qe++;
*Qe=*Mp;
Mp++;
}
Q.tu=Qe-Qh; //矩阵Q的非零元素个数
return 1;
}
int MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q) {
//求矩阵乘积Q=M?N,采用行逻辑链接存储表示。
int arow,brow,p,q,t,ctemp[30],l,ccol,tp;
稀疏矩阵运算器
一:问题描述:
稀疏矩阵是指那些多数元素为零的矩阵。利用稀疏特点进行储存和计算可以大大节省储存空间,提高计算效率。实现一个能进行称稀疏矩阵基本运算的运算器。
基本要求:
以带逻辑链接信息的三元组顺序表表示稀疏矩阵,实现矩阵相加,相减,相乘的运算。稀疏矩阵的输入形式采用三元组表示。而运算结果的矩阵则用通常的阵列形式列出。
else t = N.tu+1;
for (q=N.rpos[brow]; q< t; ++q) {
ccol = N.data[q].j; //乘积元素在Q中列号
ctemp[ccol] += M.data[p].e * N.data[q].e;

数据结构+课程设计+稀疏矩阵的操作(计算机学院)

数据结构+课程设计+稀疏矩阵的操作(计算机学院)

计算机科学技术学院学生课程设计(论文)题目:学生姓名:学号:所在院(系):专业:班级:指导教师:职称:年月日计算机科学技术学院本科学生课程设计任务书注:任务书由指导教师填写。

课程设计(论文)指导教师成绩评定表稀疏矩阵的操作1.课程设计的目的本课程设计是为了配合《数据结构》课程的开设,通过设计一完整的程序,使学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并用TC上机调试的基本方法。

利用三元组实现稀疏矩阵的有关算法。

2.问题描述2.1稀疏矩阵采用三元组表示,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C。

2.2求出A的转置矩阵D,输出D。

3. 基本要求稀疏矩阵是指那些多数元素为零的矩阵。

利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。

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

以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。

稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。

4.结构设计4.1.以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。

4.2.稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。

4.3.首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。

可设矩阵的行数和列数均不超过20。

4.4.程序可以对三元组的输入顺序加以限制,例如,按行优先。

注意研究教材的算法,以便提高计算效率。

5.在用三元组表示稀疏矩阵时,相加或相减所得结果矩阵应该另生成,乘积矩阵也可用二维数组存放5.算法思想5.1.主函数设置循环和选择语句进行运算循环和选择,进行稀疏矩阵的加法,减法,乘法,转置和是否继续运算5个分支开关进行运算选择。

5.2.设置函数分别实现稀疏矩阵的输入,输出,加法,减法,乘法。

5.3.在数组结构体中设置存放每行第一个非零元在其数组存储结构单元的位置的存储单元,若该行无非零元,则存为06.模块划分6.1typedef struct存放各行第一个非零元在存储数组中的位置,若该行无非零元,则其rpos[]值为零6.2 createsmatrix(rlsmatrix *M) 矩阵输入函数,输入各行非零元及其在矩阵中的行列数6.3 FasttransposeRLSMatrix(RLSMatrix M,RLSMatrix *Q) 矩阵快速转置6.4 HeRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) 矩阵求和6.5 ChaRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) 矩阵求差6.6 JiRLSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q) 矩阵求积7.算法实现7.1首先定义非零元个数的最大值和存放各行第一个非零元在存储数组中的位置#include<stdio.h>#define MAXSIZE 100 /* 非零元个数的最大值*/typedef struct triple{int i,j; /* 行下标,列下标*/int e; /* 非零元素值*/}triple;typedef struct tsmatrix{triple data[MAXSIZE+1]; /* 非零元三元组表,data[0]未用*/int mu,nu,tu; /* 矩阵的行数、列数和非零元个数*//* 各列第一个非零元的位置表rpos[0]未用*/}rlsmatrix;7.2创建稀疏矩阵矩阵的行数,列数,和非零元素的个数并按行序顺序输入第%d 个非零元素所在的行(1~%d),列(1~%d),元素值。

数据结构实验报告三稀疏矩阵的运算

数据结构实验报告三稀疏矩阵的运算

数据结构实验报告三稀疏矩阵的运算实验课程名称数据结构课程设计专业班级学⽣姓名学号指导教师2012 ⾄ 2013 学年第⼀学期第 1 ⾄ 18 周⽬录实验题⽬:稀疏矩阵的运算 (3)⼀:概述 (3)⼆:系统分析 (3)三:概要设计 (3)四:详细设计 (4)五:运⾏与测试 (9)六:总结与⼼得 (9)实验题⽬:稀疏矩阵的运算⼀:概述本实验设计主要实现在⼗字链表存储结构输⼊稀疏矩阵,并对稀疏矩阵进⾏相加操作,最后输出运算结果。

⼆:系统分析本实验要求设计函数在⼗字链表结构下建⽴稀疏矩阵并初始化,在创建稀疏矩阵时,需要设计在⼗字链表下创建稀疏矩阵,在输⼊出现错误时,能够对错误进⾏判别处理,初始化稀疏矩阵都为空值。

在设计输出稀疏矩阵的值的函数时,根据情况编制函数,才能准确的输出稀疏矩阵。

在对稀疏矩阵进⾏初始化时,只输⼊⾮零元素的值和它所在的所在⾏及所在列。

在对稀疏矩阵输出时,以矩阵的完整形式输出。

除此之外还要求设计相加对两个矩阵进⾏运算,并输出最终的稀疏矩阵,定义相应的矩阵类型⽤于存放两个矩阵操作后的结果矩阵,这个结果矩阵的⾏、列数需要综合多⽅⾯情况来确定。

这些函数也是整个程序的难点,需要灵活运⽤数组及指针的特点。

三:概要设计⼗字链表结构体定义:typedef struct sex{int row,col,val; //⾮零元素的⾏、列下标及值struct sex *right,*dowm; //该⾮零元素所在⾏表和列表的后继元素}Node;矩阵的加法:此功能在⼗字链表存储结构下,由函数void addition(Node *cp1, Node *cp2, Node *cp3)实现。

当⽤户选择该功能,系统即提⽰⽤户初始化要进⾏加法的两个矩阵的信息。

然后进⾏加法,最后输出结果。

四:详细设计#include#includetypedef struct sex{int row,col,val; //⾮零元素的⾏、列下标及值struct sex *right,*dowm; //该⾮零元素所在⾏表和列表的后继元素}Node;Node * Init(int m, int n){int t,i;Node *cp;t=(m>=n)?m:n;cp=(Node *)malloc( (t+1)*sizeof(Node) ); //开辟⼀串连续的内存空间(*cp).row=m;(*cp).col=n;(*cp).val=t; //此表头结点的值域⽤来记录⾏列的最⼤值,以便于后⾯的开辟空间for(i=1;i<=t;i++){cp[i].right=cp+i;cp[i].dowm=cp+i; //构成带表头结点的空循环单链表}return cp;}void CreatCrossList(Node *cp){int t,i;Node *s,*temp;printf("请输⼊⾮零元素的个数N:");scanf("%d",&t);printf("\n请输⼊其对应坐标及元素值:\n");for(i=0;i{s=(Node *)malloc( sizeof(Node));scanf("%d%d%d",&s->row,&(*s).col,&s->val);temp=cp+s->row;if( temp->right!=cp+s->row )while( temp->right!=cp+s->row && temp->right->col<=s->col )temp=temp->right;s->right=temp->right;temp->right=s; //修改⾏链表插⼊位置temp=cp+s->col;if( temp->dowm!=cp+s->col )while( temp->dowm!=cp+s->col && temp->dowm->row<=s->row )temp=temp->dowm;s->dowm=temp->dowm;temp->dowm=s; //修改列链表插⼊位置}}void output(Node *cp){int i;Node *temp;printf("\n稀疏矩阵如下:\n");for(i=1;i<=cp->row;i++){temp=cp+i;while( temp->right!=cp+i ){printf("(%d,%d %d)",temp->right->row,temp->right->col,temp->right->val); temp=temp->right;}printf("\n");}}void Insert(Node *cp, Node *s){//此插⼊函数的作⽤是:⽣成⽬标矩阵Node *temp;temp=cp+s->row; //修改⾏链表指针if( temp->right!=cp+s->row )while( temp->right!=cp+s->row && temp->right->col<=s->col ) temp=temp->right;s->right=temp->right;temp->right=s;temp=cp+s->col; //修改列链表指针if( temp->dowm!=cp+s->col )while( temp->dowm!=cp+s->col && temp->dowm->row<=s->row ) temp=temp->dowm;s->dowm=temp->dowm;temp->dowm=s;}void addition(Node *cp1, Node *cp2, Node *cp3){int i;Node *w,*p,*q;for( i=1; i<=cp2->row && i<=cp3->row; i++){p=cp2+i;q=cp3+i;while( p->right!=cp2+i && q->right!=cp3+i ){w=(Node *)malloc( sizeof(Node) );w->row=p->right->row;if( p->right->col==q->right->col ){w->col=p->right->col;w->val=p->right->val+q->right->val; //相同位置上的元素值相加p=p->right;q=q->right;if( w->val )Insert(cp1,w); //把⾮零元插⼊到⽬标矩阵中}else if( p->right->colright->col ){w->col=p->right->col;w->val=p->right->val;p=p->right;Insert(cp1,w); //把cp2中的⾮零元插⼊到⽬标矩阵中}else{w->col=q->right->col;w->val=q->right->val;q=q->right;Insert(cp1,w); //把cp2中的⾮零元插⼊到⽬标矩阵中}}if( p->right==cp2+i )while( q->right!=cp3+i ){w=(Node *)malloc( sizeof(Node) );w->row=q->right->row;w->col=q->right->col;w->val=q->right->val;q=q->right;Insert(cp1,w); //把cp3中剩余的⾮零元插⼊⽬标矩阵中} else if( q->right==cp3+i )while( p->right!=cp2+i ){w=(Node *)malloc( sizeof(Node) );w->row=p->right->row;w->col=p->right->col;w->val=p->right->val;p=p->right;Insert(cp1,w); //把cp2中剩余的⾮零元插⼊到⽬标矩阵中} else; //两个矩阵同⼀⾏中同时结束}if( i>cp2->row)while(i<=cp3->row){//把cp3中剩余⾏中的⾮零元插⼊到⽬标矩阵中q=cp3+i;while( q->right!=cp3+i ){w=(Node *)malloc( sizeof(Node) );w->row=q->right->row;w->col=q->right->col;w->val=q->right->val;q=q->right;Insert(cp1,w);}i++; //继续下⼀⾏}else if(i>cp3->row)while( i<=cp2->row ){p=cp2+i;while( p->right!=cp2+i ){w=(Node *)malloc( sizeof(Node) );w->row=p->right->row;w->col=p->right->col;w->val=p->right->val;p=p->right;Insert(cp1,w);}i++; //继续下⼀⾏}}int main(){Node *cp1, *cp2, *cp3;int a, b;printf("\t\t\t*****稀疏矩阵的加法*****\n\n");printf("请输⼊cp2的⾏、列数:");scanf("%d%d",&a,&b);cp2=Init(a,b);printf("请输⼊cp3的⾏、列数:");scanf("%d%d",&a,&b);cp3=Init(a,b);a=cp2->row>=cp3->row?cp2->row:cp3->row;b=cp2->col>=cp3->col?cp2->col:cp3->col;cp1=Init(a,b); //开始初始化结果矩阵printf("\n\t>>>>>>>创建稀疏矩阵cp2\n");CreatCrossList(cp2);printf("\n\t>>>>>>>创建稀疏矩阵cp3\n");CreatCrossList(cp3);output(cp2);output(cp3);addition(cp1,cp2,cp3);printf("\n\n相加后的"); output(cp1);return 0;}五:运⾏与测试进⾏数据测试六:总结与⼼得⼗字链表作为存储结构表⽰随机稀疏矩阵,进⾏两矩阵的相加运算,所以⾸先要定义⼀个⼗字链表作为存储结构。

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

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

实习4、稀疏矩阵运算器一、需求分析1. 问题描述稀疏矩阵是指那些多数元素为零的矩阵。

利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。

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

2. 基本要求以带“行逻辑连接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵的相加、相减和相乘运算。

稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。

3. 实现提示(1)首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否匹配。

可设聚矩阵的行数和列数不超过20。

(2)程序可以对三元组的输入顺序加以限制,例如,按行优先。

注意研究教科书5.3.2节中的算法,以便提高计算效率。

(3)在用三元组表示稀疏矩阵时,相加或者相减所得的结果矩阵应该另生成,乘积矩阵也可以用二维数组存放。

二、概要设计ADT SparseMatrix{数据对象:D={a ij |i=1,2,3……m;j = 1,2,3……n;a i,j ∈intSet,m 和n 分别称为矩阵的行数和列数}数据关系:R ={ Row,col}Row ={<a i,j ,a i,j+1>|1≤i ≤m ,1≤j ≤n-1}Col = {< a i,j ,a i,j+1>|1≤i ≤m-1,1≤j ≤n}基本操作:CreateSMatrix(*T);操作结果:创建稀疏矩阵T 。

AddRLSMatrix(M,N,*Q);初始条件:稀疏矩阵M 和N 的行数列数对应相等。

操作结果:求稀疏矩阵的和Q=M+N 。

SubRLSSMatrix(M,N,*Q);初始条件:稀疏矩阵M 和N 的行数列数对应相等。

操作结果:求稀疏矩阵的差Q=M-N 。

SMatrixrpos(*T)初始条件:稀疏矩阵T 存在。

操作结果:求稀疏矩阵的各行第一个非零元的位置表。

MulTSMatrix(M,N,*Q);初始条件:稀疏矩阵M 的列数与N 的行数对应相等。

三元组顺序表稀疏矩阵课程设计报告(不完整)

三元组顺序表稀疏矩阵课程设计报告(不完整)

1.稀疏矩阵运算器数据结构课程设计任务书针对本课程设计,完成以下课程设计任务:1、熟悉系统实现工具和上机环境。

2、根据课程设计任务,查阅相关资料。

3、针对所选课题完成以下工作:(1)需求分析(2)概要分析(3)详细设计(4)编写源程序(5)静态走查程序和上机调试程序4、书写上述文档和撰写课程设计报告。

3.课程设计报告目录4.正文(1)问题描述稀疏矩阵是指那些多数元素为零的矩阵。

利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算频率。

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

(2)需求分析本课程设计的稀疏矩阵运算器在visual studio 2013下运行调试成功,可以实现的功能有:1.矩阵运算方式选择2.根据提示输入相应数据3.显示最终结果使用的主要存储结构为三元组,并用三元组形式进行运算。

所有参与运算数据类型为整形,因此输入的数据应为整形数据。

为了节省存储空间使用三元组数据进行运算,可以通过多次扫描三元组数据来实现,即使用嵌套循环函数。

输出结果为通常的阵列形式,因此使用了右对齐,保证输出形式的整齐。

(3)概要分析本次课程设计中定义的结构体typedef struct {int i, j;//矩阵元素所在行列int v;//元素的值}triple;typedef struct {triple data[MAXSIZE];triple cop[MAXSIZE];//辅助数组int m, n, t;//矩阵的行列数}tripletable;Main函数调用子函数时输入1为调用int Push_juzhen(int m, int n, int count)函数,可以实现矩阵相加功能输入2为调用int Dec_juzhen(int m, int n, int count)函数,可实现矩阵相减功能输入3为调用int Mul_juzhen()函数,可以实现矩阵相乘功能(4)详细分析(流程图伪代码)加法函数int Push_juzhen(int m, int n, int count)//矩阵相加(行,列,矩阵数){// p行,q列,s非零元素个数,v元素值//ucount对数组下标计数的变量,与变量x实现多个矩阵相加for (int c = 0; c < count; c++){int x = 0;cout << "请输入第" << c + 1 << "个矩阵的非零元素个数" << endl;cin >> s;cout << "请依次输入非零元素所在行和列以及该非零元素的值并以空格隔开" << endl;for (; x< s; x++)//传递行列及元素值{cin >> p >> q >> v;a.cop[x].i = p;//将p赋值给data[x].ia.cop[x].j = q;//将q赋值给data[x].ja.cop[x].v = v;//将v赋值给data[x].v}//g行//h列for (int g = 1; g <= m;g++)for (int h = 1; h <= n; h++){int l;//存储下标for (l = 0; l < s; l++)//对辅助存储中的三元组进行行逻辑排序,将数据存入a.data{if (a.cop[l].i == g&&a.cop[l].j == h){a.data[u].i = a.cop[l].i;a.data[u].j = a.cop[l].j;a.data[u].v = a.cop[l].v;u++;}}}}//矩阵相加//k为行数//h为列数for (int k = 0; k < u; k++){for (int h = 0; h <= ucount; h++){if (a.data[k].i == b.data[h].i&&a.data[k].j == b.data[h].j)//判断行列是否相等b.data[h].v += a.data[k].v;else{b.data[ucount].i = a.data[k].i;b.data[ucount].j = a.data[k].j;b.data[ucount].v = a.data[k].v;ucount++;//存储空间增加计数}break;//增加一组数据时跳出循环,避免重复计算}}return 0;}相减函数int Dec_juzhen(int m, int n, int count){for (int c = 0; c < count; c++){int x = 0;cout << "请输入第" << c + 1 << "个矩阵的非零元素个数" << endl;cin >> s;cout << "请依次输入非零元素所在行和列以及该非零元素的值并以空格隔开" << endl;for (; x< s; x++)//传递行列及元素值{cin >> p >> q >> v;a.cop[x].i = p;//将p赋值给data[x].ia.cop[x].j = q;//将q赋值给data[x].ja.cop[x].v = v;//将v赋值给data[x].v}//g行//h列if (c != 0){for (int g = 1; g <= m; g++)for (int h = 1; h <= n; h++){int l;//存储下标for (l = 0; l < s; l++)//行逻辑排列{if (a.cop[l].i == g&&a.cop[l].j == h){ a.data[u].i = a.cop[l].i;a.data[u].j = a.cop[l].j;a.data[u].v =- a.cop[l].v;//c>0时为减数矩阵u++;}}}}else{for (int g = 1; g <= m; g++)for (int h = 1; h <= n; h++){int l;//存储下标for (l = 0; l < s; l++){if (a.cop[l].i == g&&a.cop[l].j == h){a.data[u].i = a.cop[l].i;a.data[u].j = a.cop[l].j;a.data[u].v = a.cop[l].v;u++;}}}}}//矩阵减法计算for (int k = 0; k < u; k++){for (int h = 0; h <= ucount; h++){if (a.data[k].i == b.data[h].i&&a.data[k].j == b.data[h].j)//判断行列相等b.data[h].v += a.data[k].v;else{b.data[ucount].i = a.data[k].i;b.data[ucount].j = a.data[k].j;b.data[ucount].v = a.data[k].v;ucount++;}break;}}return 0;}相乘函数int Mul_juzhen(){cout << "请输入第一个矩阵的行列数" << endl;cin >> m >> n;cout << "请输入第一个矩阵的非零元素个数" << endl;cin >> t1;a.m = m;a.n = n;a.t = t1;cout << "请输入第一个矩阵的非零元素所在的行、列、数值并以空格间隔" << endl;for (i=0; i < t1; i++){cin >> p >> q >> v;a.data[i].i = p;//将p赋值给data[x].ia.data[i].j = q;//将q赋值给data[x].ja.data[i].v = v;//将v赋值给data[x].v}cout << "则第二个矩阵的行数为" << a.n << "行" << endl<<endl;cout << "请输入第二个矩阵的列数" << endl;cin >> n;cout << "请输入第二个矩阵的非零元素个数" << endl;cin >> t2;b.m = a.n;b.n = n;b.t = t2;cout << "请输入第二个矩阵的非零元素所在的行、列、数值并以空格间隔" << endl;for (i = 0; i < t2; i++){cin >> p >> q >> v;b.data[i].i = p;//将p赋值给data[x].ib.data[i].j = q;//将q赋值给data[x].jb.data[i].v = v;//将v赋值给data[x].v}i = 0;//i为a、b数组标记,另设k为矩阵相乘元素扫描标记//n为检测相加元素扫描标记,z为存储标记while (i < a.t){int k;for (k = 0; k < b.t; k++){if (a.data[i].j == b.data[k].i)if (i>0){for (n = 0; n < z; n++){if (a.data[i].i == c.data[n].i&&b.data[k].j == c.data[n].j)//判断是否符合相加条件c.data[n].v += a.data[i].v*b.data[k].v;else{c.data[z].i = a.data[i].i;c.data[z].j = b.data[k].j;c.data[z].v = a.data[i].v*b.data[k].v;z++;}}}else{c.data[z].i = a.data[i].i;c.data[z].j= b.data[k].j;c.data[z].v = a.data[i].v*b.data[k].v;z++;}}i++;}return 0;}(5)调试分析(遇到的问题,修改,解决办法,时空复杂度)刚开始,程序仅使用三元组存储,计算过程使用了二维数组,但矩阵相乘会出现错误,矩阵乘法时间复杂度为矩阵一的行数乘以矩阵二的列数(m1*n2)。

数据结构实验报告稀疏矩阵运算

数据结构实验报告稀疏矩阵运算

数据结构实验报告稀疏矩阵运算实验目的:1.学习并理解稀疏矩阵的概念、特点以及存储方式。

2.掌握稀疏矩阵加法、乘法运算的基本思想和算法。

3.实现稀疏矩阵加法、乘法的算法,并进行性能测试和分析。

实验原理:稀疏矩阵是指矩阵中绝大多数元素为0的矩阵。

在实际问题中,有许多矩阵具有稀疏性,例如文本矩阵、图像矩阵等。

由于存储稀疏矩阵时,对于大量的零元素进行存储是一种浪费空间的行为,因此需要采用一种特殊的存储方式。

常见的稀疏矩阵的存储方式有三元组顺序表、十字链表、行逻辑链接表等。

其中,三元组顺序表是最简单直观的一种方式,它是将非零元素按行优先的顺序存储起来,每个元素由三个参数组成:行号、列号和元素值。

此外,还需要记录稀疏矩阵的行数、列数和非零元素个数。

稀疏矩阵加法的原理是将两个稀疏矩阵按照相同的行、列顺序进行遍历,对于相同位置的元素进行相加,得到结果矩阵。

稀疏矩阵乘法的原理是将两个稀疏矩阵按照乘法的定义进行计算,即行乘以列的和。

实验步骤:1.实现稀疏矩阵的三元组顺序表存储方式,并完成稀疏矩阵的初始化、转置、打印等基本操作。

2.实现稀疏矩阵的加法运算,并进行性能测试和分析。

3.实现稀疏矩阵的乘法运算,并进行性能测试和分析。

4.编写实验报告。

实验结果:经过实验测试,稀疏矩阵的加法和乘法算法都能正确运行,并且在处理稀疏矩阵时能够有效节省存储空间。

性能测试结果表明,稀疏矩阵加法、乘法的运行时间与非零元素个数有关,当非零元素个数较少时,运算速度较快;当非零元素个数较多时,运算速度较慢。

实验分析:稀疏矩阵的运算相对于普通矩阵的运算有明显的优势,可以节省存储空间和运算时间。

在实际应用中,稀疏矩阵的存储方式和运算算法都可以进行优化。

例如,可以采用行逻辑链接表的方式存储稀疏矩阵,进一步减少存储空间的占用;可以采用并行计算的策略加快稀疏矩阵的运算速度。

总结:通过本次实验,我深入学习了稀疏矩阵的概念、特点和存储方式,掌握了稀疏矩阵加法、乘法的基本思想和算法,并通过实验实现了稀疏矩阵的加法、乘法运算。

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

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

数据结构----稀疏矩阵运算器课程设计目录稀疏矩阵运算器设计............................................................................................ I摘要................................................................................................................ ... II第一章需求分析 (1)第二章概要设计 (2)第三章设计步骤 (6)3.1 函数说明 (6)3.2 设计步骤 (7)第四章设计理论分析方法 (20)4.1 算法一:矩阵转置.....................................................................204.2 算法二:矩阵加法.....................................................................204.3 算法三:矩阵乘法 (21)第五章程序调试 (23)第六章心得体会 (25)参考文献 (26)第一章需求分析1.稀疏矩阵是指那些多数元素为零的矩阵。

利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。

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

2.以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现矩阵转置,求逆,实现两个矩阵相加、相减和相乘的运算。

稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。

3.演示程序以用户和计算机的对话方式执行,数组的建立方式为边输入边建立。

4.由题目要求可知:首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。

5.程序可以对三元组的输入顺序不加以限制;根据对矩阵的行列,三元组作直接插入排序,从而进行运算时,不会产生错误。

(2023整理版)数据结构——稀疏矩阵运算器

(2023整理版)数据结构——稀疏矩阵运算器

数据结构——稀疏矩阵运算器数据结构——稀疏矩阵运算器---简介稀疏矩阵是一种具有很多零元素的矩阵,通常用于表示大规模数据中的稀疏性。

由于稀疏矩阵中大部分元素为零,传统的矩阵运算会浪费大量的时间和空间。

为了解决这个问题,稀疏矩阵运算器应运而生。

本文将介绍稀疏矩阵运算器的数据结构和实现方式,并演示其在稀疏矩阵加法和乘法运算中的应用。

数据结构稀疏矩阵运算器主要使用三元组存储稀疏矩阵的非零元素。

三元组由行、列和元素值组成,其中行和列表示非零元素的位置,元素值表示非零元素的值。

对于一个m行n列的稀疏矩阵,若其中k 个元素非零,则使用k个三元组来存储。

以一个3x3的稀疏矩阵为例,假设四个非零元素分别为2、4、6和8,其位置分别为(0, 0)、(1, 1)、(1, 2)和(2, 0),则对应的三元组表示为:```(0, 0, 2)(1, 1, 4)(1, 2, 6)(2, 0, 8)```三元组存储结构可以使用数组来实现。

数组的每个元素表示一个三元组,通过遍历数组可以访问稀疏矩阵中的所有非零元素。

稀疏矩阵加法运算稀疏矩阵加法运算的基本思想是将两个稀疏矩阵的非零元素进行合并。

具体步骤如下:1. 创建一个新的稀疏矩阵,其行数和列数与两个被加数矩阵相同。

2. 初始化一个空的三元组数组来存储结果矩阵的非零元素。

3. 通过遍历两个被加数矩阵的三元组数组,比较行和列是否相等:- 若行和列相等,则将两个非零元素相加,并将结果添加到结果矩阵的三元组数组中。

- 若行和列不相等,则分别将两个非零元素添加到结果矩阵的三元组数组中。

4. 返回结果稀疏矩阵。

稀疏矩阵乘法运算稀疏矩阵乘法运算的基本思想是利用稀疏矩阵的特性进行优化。

具体步骤如下:1. 创建一个新的稀疏矩阵,其行数和列数分别与被乘数的行数和乘数的列数相同。

2. 初始化一个空的三元组数组来存储结果矩阵的非零元素。

3. 遍历被乘数的三元组数组,对于每个被乘数的非零元素,遍历乘数的三元组数组,找出所有与被乘数的列相等的乘数元素,并将它们的乘积添加到结果矩阵的三元组数组中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

闽江学院数据结构课程设计报告题目:稀疏矩阵运算器院系:计算机科学系专业班级:10计算机科学与技术(网络工程)学号:学生姓名:指导教师:王润鸿2011年12月23 日目录:1、分析问题和确定解决方案 (3)1.1问题描述 (3)1.2 输入的形式和输入值的范围 (3)1.3 输出的形式 (3)1.4 程序所能达到的功能 (3)1.5 测试数据 (3)1.6 确定解决方案 (4)1.7所有抽象数据类型的定义 (4)2、详细设计 (5)2.1稀疏矩阵加法运算思路 (5)2.2稀疏矩阵减法运算思路 (7)2.3稀疏矩阵乘法运算思路 (9)2.4创建稀疏矩阵 (11)3、系统调试与测试 (12)3.1程序的菜单界面 (12)3.2 实现加法运算 (12)3.3 实现减法运算 (13)3.4实现乘法运算 (14)4、结果分析 (15)4.1、算法的时空分析 (15)4.2、经验和体会 (15)5、参考文献 (15)1、分析问题和确定解决方案1.1问题描述稀疏矩阵是指那些多数元素为零的矩阵。

利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。

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

用三元组实现稀疏矩阵的相加、相减,相乘;1.2输入的形式和输入值的范围以三元组的形式输入,首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。

可设矩阵的行数和列数均不超过20;例如:输入的三元组为:((1,1,10),(2,3,9),(3,1,-1))其对应的稀疏矩阵为:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-0019000010 1.3 输出的形式运算结果的矩阵以通常的阵列形式输出; 1.4程序所能达到的功能该程序可以实现以三元组形式输入两个矩阵,求出两个矩阵的和、差、积;并可根据输入的矩阵的行列数不同判别是否可以进行相加、减、乘,并重新输入正确的矩阵;1.5测试数据测试的数据及其结果如下:矩阵M 矩阵N 矩阵Q加法:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-0019000010 +⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--301100000 = ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-3008000010 减法:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-0190010 - ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--311000 = ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-32100010 乘法:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-70000001000000010034 X ⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡000001010024003 =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-000010008060 1.6 确定解决方案进入运算器界面后选择要实行的操作,按1实现矩阵相加,调用函数AddSMatrix ,若输入的两个矩阵行列数不相等,则提示输入错误,重新输入矩阵进行加法运算;按2实现矩阵相乘,若输入的第一矩阵的列数不等于第二个矩阵的行数,则提示输入错误,重新输入矩阵进行乘法运算;按3实现矩阵相减,若输入的两个矩阵行列数不相等,则提示输入错误,重新输入矩阵进行减法运算;按4退出程序以加法为例实现运算过程,如下:(稀疏矩阵的和为Q) 第一个稀疏矩阵M 的三元组为((1,1,10),(2,3,9),(3,1,-1)) 第二个稀疏矩阵N 的三元组为((2,3,-1),(3,1,1),(3,3,-3))M 的第一个三元组(1,1,10)与N 的第一个三元组(2,3,-1)比较,因行数1<2则Q 得到第一个三元组(1,1,10);M 的第二个三元组与N 的第一个三元组比较,因对应行列数相等则9+(-1)=8,次行列数就是Q 的行列数即得到Q 的第二个三元组为(2,3,8);M 第三个三元组(3,1,-1))与N 的第二个三元组进行比较,因对应行列数相等,且1+(-1)=0,则不进行相加;而此时只有 N 的第三个三元组(3,3,-3)符合条件,则Q 得到第三个三元组(3,3,-3);最终结果为 ((1,1,10),(2,3,8),(3,3,-3))1.7所有抽象数据类型的定义以顺序存储结构来表示三元组表,则可得到稀疏矩阵的一种压缩存储方式——三元组顺序表。

/* 稀疏矩阵的三元组顺序表存储表示 */#define MAXSIZE 1000 //假设非零元个数的最大值为1000 typedef struct{ int i,j; //该非零元的行下标和列下标 ElemType e; //该非零元数值 } Triple;typedef struct{ Triple data[MAXSIZE+1]; // 非零三元组表,data[0]未用int mu,nu,tu; //矩阵的行数(<20)、列数(<20)和非零元个数 } TSMatrix;在此,data 域中表示非零元得三元组是以行序为主序顺序排列的,这样有利于进行某些矩阵运算。

抽象数据类型稀疏矩阵的定义如下: ADT SparseMatrix{数据对象:D={aij|i=1,2,3,…,m;j=1,2,…,n;Aij(-ElemSet,m和n分别称为矩阵的行数和列数}数据关系:R={Row,Col}基本操作:CreateSMatrix(&M);操作结果:创建稀疏矩阵M。

PrintSMatrix(M);初始条件:稀疏矩阵M存在。

操作结果:输出稀疏矩阵M。

AddSMatrix(M,N,&Q);初始条件:稀疏矩阵M和N的的行数和列数对应相等。

操作结果:求稀疏矩阵的和Q=M+N。

SubSMatrix(M,N,&Q);初始条件:稀疏矩阵M和N的的行数和列数对应相等。

操作结果:求稀疏矩阵的差Q=M-N。

MultSMatrix(M,N,&Q);初始条件:稀疏矩阵M的列数等于N的行数。

操作结果:求稀疏矩阵的积Q=M X N。

}ADT SpareMatrix此流程表示的是主程序的流程以及各程序模块之间的层次(调用)关系。

2、详细设计2.1稀疏矩阵的加法运算思路比较满足条件(行数及列数都相同的两个矩阵)的两个稀疏矩阵中不为0的元素的行数及列数(即i与j),将i与j都相等的前后两个元素值e相加,保持i,j不变储存在新的三元组中,不等的则分别储存在此新三元组中。

最后得到的这个新三元组表就是两个矩阵的和矩阵的三元组表。

其算法如下:Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q){if(M.mu==N.mu&&M.nu==N.nu) //行数,列数相等才能相加{Q.mu=M.mu;Q.nu=N.nu;int p,q,k;p=1;q=1;k=1;while(p<=M.tu&&q<=N.tu) //两个稀疏矩阵存在{if(M.data[p].i==N.data[q].i)//两个稀疏矩阵的行数相等{if(M.data[p].j==N.data[q].j) //两个稀疏矩阵的列数相等{if(M.data[p].e+N.data[q].e!=0) //两个稀疏矩阵相加的结果不为0(三元组表){Q.data[k].i=M.data[p].i;Q.data[k].j=M.data[p].j;Q.data[k].e=M.data[p].e+N.data[q].e;++k;}++q;++p;}else if(M.data[p].j<N.data[q].j)//第一个稀疏矩阵列数小于第二个稀疏矩阵列数{Q.data[k]=M.data[p];//把M中的所有信息都赋给Q++p;++k;}else//第一个稀疏矩阵列数大于第二个稀疏矩阵的列数{Q.data[k]=N.data[q];++q;++k;}}else if(M.data[p].i<N.data[q].i)//第一个稀疏矩阵行列数小于第二个稀疏矩阵行数{Q.data[k]=M.data[p];++p;++k;}else//第一个稀疏矩阵行列数小于第二个稀疏矩阵行数{Q.data[k]=N.data[q];++q;++k;}}while(p<=M.tu) //只有M并且符合条件{Q.data[k]=M.data[p];++p;++k;}while(q<=N.tu) //只有N并且符合条件{Q.data[k]=N.data[q];++q;++k;}Q.tu=k-1;printf("\t\t*** *** 两个矩阵的加法结果为 *** ***\n");return OK;}else{printf("两个矩阵行,列数不等,出错了\n");CreateSMatrix(M);printf("第一个矩阵为:\n");PrintSMatrix(M);CreateSMatrix(N);printf("第二个矩阵为:\n");PrintSMatrix(N);printf("\n");AddSMatrix(M,N,Q);}}2.2稀疏矩阵相减的算法思路此思路与稀疏矩阵相加的算法思路相同,其算法如下:Status SubtMatrix(TSMatrix M, TSMatrix N,TSMatrix &Q){if(M.mu==N.mu && M.nu==N.nu) //行数,列数相等才能相减{Q.mu=M.mu;Q.nu=N.nu;int p,q,k;p=1; //M的第p个三元组q=1; //N的第q个三元组k=1; //Q的第k个三元组while(p<=M.tu&&q<=N.tu) //两个稀疏矩阵存在{if(M.data[p].i==N.data[q].i) //两个稀疏矩阵的行数相等{if(M.data[p].j==N.data[q].j)//两个稀疏矩阵的列数相等{if(M.data[p].e-N.data[q].e!=0)//两个稀疏矩阵相减的结果不为0{Q.data[k].i=M.data[p].i;Q.data[k].j=M.data[p].j;Q.data[k].e=M.data[p].e-N.data[q].e;++k;}++q;++p;}else if(M.data[p].j<N.data[q].j)//第一个稀疏矩阵列数小于第二个稀疏矩阵的列数{Q.data[k]=M.data[p];++p;++k;}else if(M.data[p].j>N.data[q].j)//第一个稀疏矩阵列数大于第二个稀疏矩阵的列{Q.data[k].i=N.data[q].i;Q.data[k].j=N.data[q].j;Q.data[k].e=-N.data[q].e; //即0-N.data[q].e++q;++k;}}else if(M.data[p].i<N.data[q].i)//第一个稀疏矩阵行列数小于第二个稀疏矩阵行数{Q.data[k]=M.data[p]; //整个三元组进行复制++p;++k;}if(M.data[p].i>N.data[q].i)//第一个稀疏矩阵行列数大于第二个稀疏矩阵行数{Q.data[k].i=N.data[q].i;Q.data[k].j=N.data[q].j;Q.data[k].e=-N.data[q].e; //即0-N.data[q].e++q;++k;}}while(p<=M.tu) //只有M并且符合条件{Q.data[k]=M.data[p];++p;++k;}while(q<=N.tu) //只有N并且符合条件{Q.data[k].i=N.data[q].i;Q.data[k].j=N.data[q].j;Q.data[k].e=-N.data[q].e;++q;++k;}Q.tu=k-1;printf("\t\t*** *** 两个矩阵的相减结果为 *** ***\n");return OK;}else{printf("两个矩阵行列数不等,不能相减,请重新输入\n");CreateSMatrix(M);printf("第一个矩阵为:\n");PrintSMatrix(M);CreateSMatrix(N);printf("第二个矩阵为:\n");PrintSMatrix(N);printf("\n");SubtMatrix(M,N,Q);}}2.3稀疏矩阵相乘的算法思路两个相乘的矩阵为M与N,对M中每个元素M.data[p](p=1,2,…,M.tu),找到N中所有满足条件M.data[p].j=N.data[q].i的元素N.data[q],求得M.data[p].v 和N.data[q].v的乘积,又T(i,j)=∑M(i,k)×N(k,j),乘积矩阵T中每个元素的值是个累计和,这个乘积M.data[p].v×N.data[q].v只是T[i][j]中的一部分。

相关文档
最新文档