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

合集下载

稀疏矩阵运算器实验报告

稀疏矩阵运算器实验报告
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;

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

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

数据结构实验报告三稀疏矩阵的运算实验课程名称数据结构课程设计专业班级学⽣姓名学号指导教师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.程序可以对三元组的输入顺序不加以限制;根据对矩阵的行列,三元组作直接插入排序,从而进行运算时,不会产生错误。

稀疏矩阵(算法与数据结构课程设计)

稀疏矩阵(算法与数据结构课程设计)

稀疏矩阵一、问题描述假若在n m ⨯阶中,有t 个元素不为零,令nm t ⨯=δ称为矩阵的稀疏因子。

通常认为≤δ0.05时称为稀疏矩阵。

稀疏矩阵的研究大大的减少了数据在计算机中存储所需的空间,然而,它们的运算却与普通矩阵有所差异。

通过本次实验实现稀疏矩阵的转置、加法和乘法等多种运算。

二、基本要求1、稀疏矩阵采用三元组表示,建立稀疏矩阵,并能按矩阵和三元组方式输出;2、编写算法,完成稀疏矩阵的转置操作;3、编写算法,完成对两个具有相同行列数的稀疏矩阵进行求和操作;4、编写算法,对前一矩阵行数与后一矩阵列数相等的两个矩阵,完成两个稀疏矩阵的相乘操作。

三、测试数据1、转置操作的测试数据:⎪⎪⎪⎪⎪⎭⎫ ⎝⎛00200013000010020100 2、相加操作的测试数据: ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛00200013000010020100 ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛00200010000210030300 3、相乘操作的测试数据: ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛0000000300400021 ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛001002000021 四、算法思想1、三元组结构类型为Triple ,用i 表示元素的行,j 表示元素的列,e 表示元素值。

稀疏矩阵的结构类型为TSMatrix ,用数组data[]表示三元组,mu 表示行数,nu 表示列数,tu 表示非零元个数。

2、稀疏矩阵转置的算法思想将需要转置的矩阵a 所有元素存储在三元组表a.data 中,按照矩阵a 的列序来转置。

为了找到a的每一列中所有非零元素,需要对其三元组表a.data扫描一遍,由于a.data 是以a的行需序为主序来存放每个非零元的,由此得到的就是a的转置矩阵的三元组表,将其储存在b.data中。

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

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

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

稀疏矩阵应用摘要本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。

在程序设计中,考虑到方法的难易程度,采用了先用三元组实现稀疏矩阵的输入,输出,及其转置,相加,相乘操作的方法,再在十字链表下实现。

程序通过调试运行,结果与预期一样,初步实现了设计目标。

关键词程序设计;稀疏矩阵;三元组;十字链表1 引言1.1课程设计任务本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。

稀疏矩阵采用三元组和十字链表表示,并在两种不同的存储结构下,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C;求出A的转置矩阵D,输出D;求两个稀疏矩阵A和B的相乘矩阵E,并输出E。

1.2课程设计性质数据结构课程设计是重要地实践性教学环节。

在进行了程序设计语言课和《数据结构》课程教学的基础上,设计实现相关的数据结构经典问题,有助于加深对数据结构课程的认识。

本课程设计是数据结构中的一个关于稀疏矩阵的算法的实现,包括在三元组和十字链表下存储稀疏矩阵,并对输入的稀疏矩阵进行转置,相加,相乘等操作,最后把运算结果输出。

此课程设计要求对数组存储结构和链表存储结构非常熟悉,并能熟练使用它们。

1.3课程设计目的其目的是让我们在学习完C、数据结构等课程基础上,掌握多维数组的逻辑结构和存储结构、掌握稀疏矩阵的压缩存储及转置,相加,相乘等基本操作,并用不同的方法输出结果,进一步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。

2需求分析2.1设计函数建立稀疏矩阵及初始化值和输出稀疏矩阵的值本模块要求设计函数建立稀疏矩阵并初始化,包括在三元组结构下和十字链表结构下。

首先要定义两种不同的结构体类型,在创建稀疏矩阵时,需要设计两个不同的函数分别在三元组和十字链表下创建稀疏矩阵,在输入出现错误时,能够对错误进行判别处理,初始化稀疏矩阵都为空值,特别注意在十字链表下,对变量进行动态的地址分配。

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

科技大学数据结构课程设计说明书题目:稀疏矩阵运算器设计学生:学号:专业:计算机科学与技术班级:计09-1班指导教师:月峰2011 年 6 月 24 日稀疏矩阵运算器设计摘要摘要:设计一稀疏矩阵运算器。

实现转置,相加,相乘的功能。

用“带行逻辑信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相转置、相加和相乘的运算,采用分级的设计方法,分别设计出转置、加、乘运算器的子程序,相加运算时只要依次扫描两矩阵的行号和列号,若相等则相加后存入结果矩阵,不等时则存入较小的。

相减运算与相加运算相同,同样比较两矩阵的行号和列号,只是不等时,若第一个小,则存入第一个的元素,若第二个小,则存入其相反数。

相乘运算要先判断两矩阵能否相乘。

通过给顶的行号和列号找出原矩阵对应的元素值。

当在三元组表示中找到时返回其元素值,找不到时,说明该位置为0,因此返回0。

然后利用该函数计算出C的行号i和列号j 处的元素值,若该值不为0,则存入矩阵,否则不存入。

通过实验表明本程序能够进行稀疏矩阵的相加,相减,相乘运算。

具备矩阵的加、减、乘功能。

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

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

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

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

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

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

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

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

6.在用三元组表示稀疏矩阵时,相加、乘积和相减所得结果矩阵应该另生成;矩阵求逆时,为了算法方便,使用二维数组存放。

7.程序在VC6.0环境下设计。

程序执行的命令为:1.稀疏矩阵转置; 2.稀疏矩阵加法; ;3. 稀疏矩阵乘法; 4.退出的工作。

第二章概要设计1.抽象数据类型稀疏矩阵的定义如下:ADT SparseMatrix{数据对象:D={aij|i=1,2,…,m; j=1,2,…,n;aij∈ElemSet, m和n分别为矩阵的行数和列数} 数据关系:R={Row,Col }Row={﹤ai,j , ai,j+1﹥| 1≤i≤m, 1≤j≤n-1}Col = {﹤ai,j , ai+1,j﹥| 1≤i≤m-1, 1≤j≤n}基本操作:create(TSMatrix &TM)操作结果:创建稀疏矩阵矩阵TMLocateELem(TSMatrix M,int i,int j,int e)初始条件:稀疏矩阵M存在操作结果:稀疏矩阵中是否存在非零元素A[i][j],若存在返回e disp(TSMatrix TM)初始条件:稀疏矩阵TM存在操作结果:通常形式输出稀疏矩阵InsertSortMatrix(TSMatrix &TM)初始条件:稀疏矩阵TM存在操作结果:根据对矩阵的行列,三元组TM作直接插入排序TransposeSMatrix(TSMatrix M,TSMatrix &T)初始条件:稀疏矩阵M和T存在操作结果:求稀疏矩阵M转置的稀疏矩阵TAddTSM(TSMatrix A,TSMatrix B,TSMatrix &C)初始条件:稀疏矩阵A,B和C存在操作结果:稀疏矩阵的加法运算:C=A+BSubTSM(TSMatrix A,TSMatrix B,TSMatrix &C)初始条件:稀疏矩阵A,B和C存在操作结果:稀疏矩阵的减法运算:C=A-BMultSMatrix(TSMatrix A,TSMatrix B,TSMatrix &C)初始条件:稀疏矩阵A,B和C存在操作结果:稀疏矩阵的乘法运算:C=A×BNiMatrix(TSMatrix &TM)初始条件:稀疏矩阵TM存在操作结果:稀疏矩阵求逆}ADT SparseMatrix;2. 主程序:void main( ){初始化;do {接受命令;选择处理命令;}while(命令!=“退出”)}3. 本程序有四个模块,调用关系如下:图2.1 4 本程序的流程图图2.2第三章设计步骤3.1函数说明稀疏矩阵的三元组顺序表存储表示:typedef struct // 定义三元组的元素{int i,j;int v;}Triple;class tripletable{ //设计类来描述稀疏矩阵及其操作public:aaa *pdata;triple data[maxsize];int rpos[maxsize]; tripletable();~tripletable();void convert() ;void add( );void multi ( );private:int m ;int n ;int t ;int a ;};主要函数:tripletable();~tripletable();void convert( ) ;void add( );void multi ( );void main( );3.2设计步骤:设计一个矩阵类实现矩阵的运算:class tripletable(包含矩阵的各种运算函数)。

输入矩阵(以三元组形式输入非零元){int k;tripletable A,B;cout<<"输入稀疏矩阵A的行数,列数和非零元个数:";cin>>A.m>>A.n>>A.t;for(k=1;k<=A.t;k++){printf("输入第%d个非0元素的行数,列数和值:",k);cin>>A.data[k].i>>A.data[k].j>>A.data[k].v;}输出矩阵:int c[100][100]={0};for(k=1;k<=B.t;k++){c[B.data[k].i][B.data[k].j]=B.data[k].v;}cout<<"转置(加法,乘法)结果为:"<<endl;for(k=1;k<=B.n;k++){for(int l=1;l<=B.m;l++)cout<<c[k][l]<<" ";cout<<endl;}}转置矩阵:void tripletable::convert( ) //矩阵的转置{int k;tripletable A,B;cout<<"输入稀疏矩阵A的行数,列数和非零元个数:"; cin>>A.m>>A.n>>A.t;for(k=1;k<=A.t;k++){printf("输入第%d个非0元素的行数,列数和值:",k); cin>>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 q=1,col;for(col=1;col<=A.n;++col)for(int 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;}cout<<"输入为:"<<endl;for(k=1;k<=B.m;k++){for(int l=1;l<=B.n;l++)cout<<shuru[k][l]<<" ";cout<<endl;}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;}cout<<"结果为:"<<endl;for(k=1;k<=B.n;k++){for(int l=1;l<=B.m;l++)cout<<result[k][l]<<" ";cout<<endl;}}以上主要设计思想:通过三元组输入一个矩阵A,为了找到A的每一列中所有非零元素,需要对其三元组表A.data从第一行起整个扫描一遍,由于A.data是以A的行序为主序来存放每个非零元的,由此得到的恰是B.data的应有的顺序。

加法矩阵:void tripletable::add( ) //矩阵的加法{int k;tripletable A,B;cout<<"输入稀疏矩阵A的行数,列数和非零元个数:";cin>>A.m>>A.n>>A.t;for(k=1;k<=A.t;k++){printf("输入第%d个非0元素的行数,列数和值:",k);cin>>A.data[k].i>>A.data[k].j>>A.data[k].v;}cout<<"输入稀疏矩阵B的行数,列数和非零元个数:";cin>>B.m>>B.n>>B.t;for(k=1;k<=B.t;k++){printf("输入第%d个非0元素的行数,列数和值:",k);cin>>B.data[k].i>>B.data[k].j>>B.data[k].v;}if(A.m!=B.m||A.n!=B.n){cout<<"输入错误:A与B的行数或列数不相同,请重新输入"<<endl; 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;}cout<<"A输入为:"<<endl;for(k=1;k<=A.m;k++){for(int l=1;l<=A.n;l++)cout<<a[k][l]<<" ";cout<<endl;}int b[100][100]={0};for(k=1;k<=B.t;k++){b[B.data[k].i][B.data[k].j]=B.data[k].v;}cout<<"B输入为:"<<endl;for(k=1;k<=B.m;k++){for(int l=1;l<=B.n;l++)cout<<b[k][l]<<" ";cout<<endl;}int c[100][100]={0};for(k=1;k<=A.m;k++){for(int l=1;l<=A.n;l++){c[k][l]=a[k][l]+b[k][l];}}cout<<"加法结果C为:"<<endl;for(k=1;k<=A.m;k++){for(int l=1;l<=A.n;l++)cout<<c[k][l]<<" ";cout<<endl;}}以上主要设计思想:此功能由函数add( )实现,当用户选择该功能时系统即提示用户初始化要进行加法的两个矩阵的信息。

相关文档
最新文档