实现稀疏矩阵(采用三元组表示)的基本运算实验报告

合集下载

稀疏矩阵运算器实验报告

稀疏矩阵运算器实验报告
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.学习并理解稀疏矩阵的概念、特点以及存储方式。

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

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

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

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

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

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

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

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

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

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

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

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

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

4.编写实验报告。

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

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

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

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

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

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

稀疏矩阵运算器实习报告

稀疏矩阵运算器实习报告

数据结构实验报告数组和广义表题目:稀疏矩阵运算器物联网1班 1405891陈世超 140515411 2015.11.8一、需求分析稀疏矩阵是指那些多数元素为零的矩阵。

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

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

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

输入以三元组表示,输出以通常的阵列形式列出。

二、概要设计1、抽象数据类型定义ADT Array {数据对象:D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1}数据关系:R = { ROW, COL }ROW = {<ai,j,ai+1,j>| 0≤i≤b1-2, 0≤j≤b2-1}COL = {<ai,j,ai,j+1>| 0≤i≤b1-1, 0≤ j≤b2-2}基本操作:CreateSMatrix(&M);//操作结果:创建稀疏矩阵M. Print SMatrix(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*N.2、本程序包含四个模块1)主程序模块Void main(){初始化Do{接受命令;处理命令;}while(命令!=“退出”)}2)模块调用关系图主程序模块↓创建稀疏矩阵模块↓运算稀疏矩阵模块三、详细设计#define MAXSIZE 20#define MAXRC 10#include<iostream>using namespace std;typedef struct{int i,j;int e;}Triple;typedef struct{Triple data[MAXSIZE+1];int rpos[MAXRC+1];int mu,nu,tu;//mu是行,nu是列,tu是非零元个数}Matrix;void creatematrix(Matrix& M){int m,n,t,e;int num[MAXSIZE+1];//每行非零元素个数do{cout<<"输入矩阵的行数,列数和非零元数:"<<endl;cout<<"矩阵行数:";cin>>m;cout<<"矩阵列数:";cin>>n;cout<<"非零元个数:";cin>>t;if(m<0||n<0||t<0||t>m*n)cout<<"error";}while(m<0||n<0||t<0||t>m*n);//检测输入是否合法M.mu = m, M.nu = n, M.tu = t;//保存数据int i,j,k,a;int flag[MAXSIZE][MAXSIZE];//标记数组:此位置是否已经有非零元素for(i=0;i<MAXSIZE;i++) //标记数组的初始化for(j=0;j<MAXSIZE;j++)flag[i][j]=0;for(k=1;k<=t;k++){do{cout<<"输入第"<<k<<"个非零元(共"<<t<<"个)的行数,列数和非零元:"<<endl;cin>>i>>j>>e;if(i<=0||i>m||j<=0||j>n)cout<<"error"<<endl;if(flag[i][j]!=0){cout<<"重复!"<<endl;flag[i][j]=2;}if(e==0)cout<<"error"<<endl;}while(i<=0||i>m||j<=0||j>n||flag[i][j]==2||e==0);//检测输入是否合法for(a=1;a<=k-1&&(i>M.data[a].i||(i==M.data[a].i&&j>M.data[a].j)); a++);//找到此三元组插入的位置for(int b=k-1;b>=a;b--)M.data[b+1]=M.data[b];//行序比它大的三元组依次向后移动M.data[a].i=i;//保存数据M.data[a].j=j;//保存数据M.data[a].e=e;//保存数据}for(i=1;i<=M.mu;i++)num[i]=0;for(t=1;t<=M.tu;t++)num[M.data[t].i]++;//求M中每一行含非零元素个数M.rpos[1]=1;for(i=2;i<=M.mu;i++)M.rpos[i]=M.rpos[i-1]+num[i-1];}void printmatrix(Matrix M)//输出矩阵{for(int i=1, k=1;i<=M.mu;i++){for(int j=1;j<=M.nu;j++){if(M.data[k].i==i&&M.data[k].j==j){cout<<M.data[k].e<<"\t";k++;}elsecout<<"0\t";}cout<<endl;}cout<<"矩阵共有"<<M.mu<<"行"<<M.nu<<"列"<<M.tu<<"个非零元元素"<<endl;}void jiafa(Matrix M,Matrix N,Matrix& Q){if(M.mu!=N.mu||M.nu!=N.nu)cout<<"error"<<endl;Q.mu=M.mu;Q.nu=M.nu;Q.tu=0;int m,n,t;m=n=t=1;for(int row=1;row<=M.mu;row++){if(M.data[m].i==row&&N.data[n].i==row)//矩阵行数相等{if(M.data[m].j==N.data[n].j)//矩阵列数相等{int sum=M.data[m].e+N.data[n].e;if(sum!=0){Q.data[t].i=row;Q.data[t].j=M.data[m].j;Q.data[t].e=sum;Q.tu++;++m;++n;++t;}else{++m;++n;}}}while(M.data[m].i==row)//M矩阵剩下的元素{Q.data[t].i=row;Q.data[t].j=M.data[m].j;Q.data[t].e=M.data[m].e;Q.tu++;++m;++t;}while(N.data[n].i==row)//N矩阵剩下的元素{Q.data[t].i=row;Q.data[t].j=N.data[n].j;Q.data[t].e=N.data[n].e;Q.tu++;++n;++t;}}cout<<"矩阵相加结果为:"<<endl;printmatrix(Q);cout<<endl;}void jianfa(Matrix M,Matrix N,Matrix& Q){if(M.mu!=N.mu||M.nu!=M.nu)cout<<"error"<<endl;Q.mu=M.mu;Q.nu=M.nu;Q.tu=0;int m,n,t;m=n=t=1;for(int row=1;row<=M.mu;row++){if(M.data[m].i==row&&N.data[n].i==row)//矩阵行数相等{if(M.data[m].j==N.data[n].j)//矩阵列数相等{int cha=M.data[m].e-N.data[n].e;if(cha!=0){Q.data[t].i=row;Q.data[t].j=M.data[m].j;Q.data[t].e=cha;Q.tu++;m++;n++;t++;}else{m++;n++;}}}while(M.data[m].i==row)//M矩阵剩下的元素{Q.data[t].i=row;Q.data[t].j=M.data[m].j;Q.data[t].e=M.data[m].e;Q.tu++;m++;t++;}while(N.data[n].i==row)//N矩阵剩下的元素{Q.data[t].i=row;Q.data[t].j=N.data[n].j;int e1=N.data[n].e;e1=0-e1;Q.data[t].e=e1;Q.tu++;n++;t++;}}cout<<"矩阵相减结果为"<<endl;printmatrix(Q);cout<<endl;}void chengfa(Matrix M,Matrix N,Matrix& Q){int ctemp[MAXSIZE+1];int tp,t,col,p,q;int arow=1,brow=1;if(M.nu!=N.mu)//稀疏矩阵M的列数和N的行数不相等,不能相乘cout<<"error"<<endl;Q.mu=M.mu;Q.nu=N.nu;Q.tu=0;if(M.tu*N.tu!=0){for(arow=1;arow<=M.mu;arow++){for(int i=1;i<=Q.nu;i++)ctemp[i]=0;//当前行各元素累加器清零Q.rpos[arow]=Q.tu+1;if(arow<M.mu)tp=M.rpos[arow+1];elsetp=M.tu+1;for( p=M.rpos[arow];p<tp;p++)//对当前行中的每一个非零元{brow=M.data[p].j; //找到对应元在N中的行号if(brow<N.mu)t=N.rpos[brow+1];elset=N.tu+1;for( q=N.rpos[brow];q<t;q++){col=N.data[q].j;//乘积元素在Q中列号ctemp[col]+=M.data[p].e * N.data[q].e;}}for(col=1;col<=Q.nu;col++)//压缩存储该行非零元if(ctemp[col]){if(++Q.tu>MAXSIZE)cout<<"error"<<endl;Q.data[Q.tu].i=arow;Q.data[Q.tu].j=col;Q.data[Q.tu].e=ctemp[col];}}}cout<<"矩阵相乘结果为:"<<endl;printmatrix(Q);cout<<endl;}int main(){int chioce;Matrix M,N,Q;int i;cout<<"1、输入矩阵1:"<<endl;cout<<"2、输入矩阵2:"<<endl;cout<<"3、矩阵相加"<<endl;cout<<"4、矩阵相减"<<endl;cout<<"5、矩阵相乘"<<endl;cout<<"6、结束"<<endl;cout<<"输入选择功能:"<<endl;do{cin>>chioce;switch(chioce){case 1:creatematrix(M);printmatrix(M);i=1;break;case 2:creatematrix(N);printmatrix(N);i=1;break;case 3:jiafa(M,N,Q);i=1;break;case 4:jianfa(M,N,Q);i=1;break;case 5:chengfa(M,N,Q);i=1;break;case 6:i=0;}cout<<"输入选择功能:"<<endl;}while(i!=0);return 0;}四、调试分析1、开始对三元组了解不彻底,致使代码总是出现基本错误2、对于矩阵相乘的算法参考了书很久,并请教了同学3、矩阵乘法运算在调试中出现多次错误,反复试验才调试好五、用户手册1.本程序的运行环境为DOS操作系统,执行文件为TestMaze.exe2.进入演示程序后即显示文本方式的用户界面:。

实验报告五:稀疏矩阵的三元组实现实验

实验报告五:稀疏矩阵的三元组实现实验

实验报告
实验五稀疏矩阵的三元组实现实验(4学时)
实验目的:
掌握稀疏矩阵的三元组表示方法、算法实现。

实验内容:(类C算法的程序实现,任选其二)
(1) 基于三元组的稀疏矩阵表示与输入、输出方法(必做);
(2) 基于三元组的稀疏矩阵加法(选做);
(3) 基于三元组表示的稀疏矩阵转置(选做);
(4) 基于三元组表示的稀疏矩阵的乘法(选做)。

实验准备:
1) 计算机设备;2) 程序调试环境的准备,如TC环境;3) 实验内容的算法分析与代码设计与分析准备。

实验步骤:
1.录入程序代码并进行调试和算法分析;
2.编写实验报告。

实验结果:
试验的完整的C程序代码,以及程序实现与结果分析。

源程序:
1,三元组的顺序表存储表示
2,创建一个稀疏矩阵
3,表示这个矩阵
4,主函数
最终结果:。

稀疏矩阵编程实验报告

稀疏矩阵编程实验报告

一、实验目的1. 理解稀疏矩阵的概念及其存储方式。

2. 掌握稀疏矩阵的基本操作,包括转置、加法、减法和乘法。

3. 通过编程实践,提高对数据结构和算法的理解和应用能力。

二、实验环境1. 编程语言:C语言2. 开发环境:Visual Studio 20193. 操作系统:Windows 10三、实验内容1. 稀疏矩阵的三元组表示及其实现2. 稀疏矩阵的转置3. 稀疏矩阵的加法、减法和乘法四、实验步骤1. 稀疏矩阵的三元组表示及其实现(1)定义稀疏矩阵的三元组结构体:```ctypedef struct {int row; // 行号int col; // 列号double val; // 非零元素值} Triple;```(2)定义稀疏矩阵结构体:typedef struct {int rows; // 矩阵行数int cols; // 矩阵列数int nums; // 非零元素个数Triple data; // 非零元素的三元组数组} SparseMatrix;```(3)编写函数实现稀疏矩阵的创建:```cvoid createSparseMatrix(SparseMatrix sm, int rows, int cols, int nums) { sm->rows = rows;sm->cols = cols;sm->nums = nums;sm->data = (Triple )malloc(nums sizeof(Triple));}```(4)编写函数实现稀疏矩阵的销毁:```cvoid destroySparseMatrix(SparseMatrix sm) {free(sm->data);sm->data = NULL;}2. 稀疏矩阵的转置(1)编写函数实现稀疏矩阵的转置:```cvoid transposeSparseMatrix(SparseMatrix src, SparseMatrix dst) {dst->rows = src->cols;dst->cols = src->rows;dst->nums = src->nums;dst->data = (Triple )malloc(src->nums sizeof(Triple));for (int i = 0; i < src->nums; i++) {dst->data[i].row = src->data[i].col;dst->data[i].col = src->data[i].row;dst->data[i].val = src->data[i].val;}}```3. 稀疏矩阵的加法、减法和乘法(1)编写函数实现稀疏矩阵的加法:```cvoid addSparseMatrix(SparseMatrix sm1, SparseMatrix sm2, SparseMatrix result) {result->rows = sm1->rows;result->cols = sm1->cols;result->nums = 0;for (int i = 0; i < sm1->nums; i++) {for (int j = 0; j < sm2->nums; j++) {if (sm1->data[i].row == sm2->data[j].row && sm1->data[i].col == sm2->data[j].col) {if (sm1->data[i].val + sm2->data[j].val != 0) {result->data[result->nums++] = sm1->data[i];result->data[result->nums - 1].val += sm2->data[j].val;}}}}}```(2)编写函数实现稀疏矩阵的减法:```cvoid subSparseMatrix(SparseMatrix sm1, SparseMatrix sm2, SparseMatrix result) {result->rows = sm1->rows;result->cols = sm1->cols;result->nums = 0;for (int i = 0; i < sm1->nums; i++) {for (int j = 0; j < sm2->nums; j++) {if (sm1->data[i].row == sm2->data[j].row && sm1->data[i].col == sm2->data[j].col) {if (sm1->data[i].val - sm2->data[j].val != 0) {result->data[result->nums++] = sm1->data[i];result->data[result->nums - 1].val -= sm2->data[j].val;}}}}}```(3)编写函数实现稀疏矩阵的乘法:```cvoid mulSparseMatrix(SparseMatrix sm1, SparseMatrix sm2, SparseMatrix result) {result->rows = sm1->rows;result->cols = sm2->cols;result->nums = 0;for (int i = 0; i < sm1->nums; i++) {for (int j = 0; j < sm2->nums; j++) {if (sm1->data[i].col == sm2->data[j].row) {double sum = 0;for (int k = 0; k < sm1->nums; k++) {if (sm1->data[k].col == sm2->data[j].row) {sum += sm1->data[k].val sm2->data[j].val;}}if (sum != 0) {result->data[result->nums++] = sm1->data[i];result->data[result->nums - 1].val = sum;}}}}}```五、实验结果与分析1. 通过编程实现稀疏矩阵的基本操作,验证了算法的正确性。

稀疏矩阵的转置实训报告

稀疏矩阵的转置实训报告

#### 一、实训背景稀疏矩阵在计算机科学和工程领域中有着广泛的应用,特别是在处理大规模数据时,由于其数据压缩的特性,可以显著降低存储空间和计算时间。

稀疏矩阵的转置是稀疏矩阵处理中的一个基本操作,对于理解稀疏矩阵的性质和进行后续的矩阵运算至关重要。

本实训旨在通过实现稀疏矩阵的转置功能,加深对稀疏矩阵数据结构和操作的理解。

#### 二、实训目标1. 理解稀疏矩阵的概念和特点。

2. 掌握稀疏矩阵的三元组表示方法。

3. 实现稀疏矩阵的转置操作。

4. 分析转置操作的算法复杂度。

5. 对比不同转置算法的性能。

#### 三、实训内容1. 稀疏矩阵的三元组表示稀疏矩阵的三元组表示法通过三元组(i, j, e)来存储非零元素,其中i和j分别表示行和列的索引,e表示对应的元素值。

这种方法能够有效地压缩存储空间。

2. 稀疏矩阵的转置稀疏矩阵的转置操作涉及到交换行和列的索引。

具体步骤如下:- 遍历原稀疏矩阵中的所有非零元素。

- 对于每个非零元素(i, j, e),将其存储为(j, i, e)并添加到转置矩阵中。

3. 算法实现使用C++语言实现稀疏矩阵的转置,主要包括以下步骤:- 定义稀疏矩阵的数据结构。

- 实现转置函数。

- 测试转置函数的正确性和效率。

4. 性能分析分析不同转置算法的时间复杂度和空间复杂度,对比不同实现方式的性能。

#### 四、实训过程1. 数据结构设计使用结构体来定义稀疏矩阵的三元组,包括行索引、列索引和元素值。

同时,定义一个数组来存储所有的三元组。

2. 转置函数实现实现一个转置函数,该函数接收一个稀疏矩阵的三元组数组,返回一个新的三元组数组,表示转置后的稀疏矩阵。

3. 测试编写测试代码,创建一个稀疏矩阵实例,调用转置函数,并验证转置后的矩阵是否正确。

4. 性能测试使用不同的稀疏矩阵实例进行性能测试,比较不同实现方式的效率。

#### 五、实训结果与分析1. 结果通过实训,成功实现了稀疏矩阵的转置功能,并验证了其正确性。

稀疏矩阵基本操作 实验报告

稀疏矩阵基本操作 实验报告

稀疏矩阵基本操作实验报告一、实验内容稀疏矩阵的压缩储存结构,以及稀疏矩阵的三元组表表示方法下的转置、相加、相乘等算法二、实验目的1.熟悉数组、矩阵的定义和基本操作2.熟悉稀疏矩阵的储存方式和基本运算3.理解稀疏矩阵的三元组表类型定义,掌握稀疏矩阵的输入、输出和转置算法三、实验原理1.使用三元组储存矩阵中的非零元素(三元组分别储存非零元素的行下标,列下标和元素值)。

除了三元组表本身,储存一个稀疏矩阵还需要额外的三个变量,分别储存矩阵的非零元个数,矩阵的行数和矩阵的列数。

2.稀疏矩阵的创建算法:第一步:根据矩阵创建一个二维数组,表示原始矩阵第二步:取出二维数组中的元素(从第一个元素开始取),判断取出元素是否为非零元素,如果为非零元素,把该非零元素的数值以及行下标和列下表储存到三元数组表里,否则取出下一个元素,重复该步骤。

第三步:重复第二步,知道二维数组中所有的元素已经取出。

3.稀疏矩阵倒置算法:第一步:判断进行倒置的矩阵是否为空矩阵,如果是,则直接返回错误信息。

第二步:计算要倒置的矩阵每列非零元素的数量,存入到num数组(其中num[i] 代表矩阵中第i列非零元素的个数)。

以及倒置后矩阵每行首非零元的位置,存入cpot 数组中(其中cpot表示倒置后矩阵每行非零元的位置,对应表示原矩阵每列中第一个非零元的位置)。

第三步:确定倒置后矩阵的行数和列数。

第四步:取出表示要导致矩阵中三元组表元素{e, I, j}(第一次取出第一个,依次取出下一个元素),从第二步cpot数组中确定该元素倒置后存放的位置(cpot[j]),把该元素的行下标和列下标倒置以后放入新表的指定位置中。

cpot[j] 变量加一。

第五步:重复第四步,直到三元组表中所有的元素都完成倒置。

第六步:把完成倒置运算的三元组表输出。

4.稀疏矩阵加法算法:第一步:检查相加两个矩阵的行数和列数是否相同,如果相同,则进入第二步,否则输出错误信息。

第二步:定义变量i和j,用于控制三元组表的遍历。

稀疏矩阵实验报告(包括问题描述,源代码,实验结果等)

稀疏矩阵实验报告(包括问题描述,源代码,实验结果等)

数据结构课程设计实习报告题目:班级:学号:姓名:实习报告1.问题描述稀疏矩阵的操作基本功能要求:(1)稀疏矩阵采用三元组表示,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C。

(2)求出A的转置矩阵D,输出D。

2.设计1)设计思想矩阵中如果多数的元素没有数据,则会造成存储器空间的浪费,为此,必须设计稀疏矩阵的阵列储存方式,利用较少的存储器空间储存完整的矩阵数据。

但是这些存储空间的大部分存放的是0元素,从而造成大量的空间浪费.为了节省存储空间,可以只存储其中的非0元素. 对于矩阵Amn的每个元素aij,知道其行号i 和列号j就可以确定其位置.因此对于稀疏矩阵可以用一个结点来存储一个非0元素.该结点可以定义成: [i,j,aij]创建一个矩阵A和矩阵B,这两个稀疏矩阵具有相同行列数,然后矩阵A与矩阵B相加得到矩阵C,并输出C,稀疏矩阵采用三元组表示。

并调用原矩阵A 转置得到矩阵D,输出D。

2) 设计表示法(1) 函数调用关系如图所示。

3)实现注释:实现了原题中要求的:两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C;得到矩阵A的转置矩阵D,输出D;稀疏矩阵均采用三元组表示。

3.调试报告调试程序时,应注意矩阵的调用。

比如,开始的时候没有注意将程序调用,最后尽管实现了矩阵的转置和相加,但没有符合题意。

题目要求的是用创建好的矩阵A和矩阵B进行相加,并对矩阵A进行转置,所以要调用好矩阵。

4.程序清单#include<stdio.h>#include<stdlib.h>#define MAXSIZE 100typedef struct{int i,j;int e;}Triple;typedef struct{Triple data[MAXSIZE+1];int mu,nu,tu; //mu、nu为稀疏矩阵的行列数,tu为稀疏矩阵的非零元素个数}TSMatrix;TSMatrix M,T,S,B,C;void CreateMatrix(TSMatrix &M){int i,elem,col,row,mu,nu,tu;printf("请输入稀疏矩阵的行数、列数和非零元素的个数:\n");scanf("%d%d%d",&mu,&nu,&tu);M.mu=mu;M.nu=nu;M.tu=tu;for (i=1;i<=tu;i++){printf("请输入非零元素的行号、列号和值:\n");scanf("%d%d%d",&col,&row,&elem);if ( mu<=1 || col>M.mu ||nu<=1 || row>M.nu){printf("error!");exit(0);}else{M.data[i].i=col; //输出这个三元组M.data[i].j=row;M.data[i].e=elem;}}}void FastTransposeSMatrix(TSMatrix M) /*求转置矩阵*/ {int num[100];int cpot[100];int p,q,t,col=0;T.mu=M.nu; // 给T的行、列数与非零元素个数赋值T.nu=M.mu;T.tu=M.tu;if(T.tu){for(col=1;col<=M.nu;col++){num[col]=0;}for(t=1;t<=M.tu;t++){num[M.data[t].j]++;}cpot[1]=1;for(col=2;col<=M.nu;col++){cpot[col]=cpot[col-1]+num[col-1];}for(p=1;p<=M.tu;++p){col=M.data[p].j;q=cpot[col];T.data[q].i=M.data[p].j;T.data[q].j=M.data[p].i;T.data[q].e=M.data[p].e;cpot[col]++;}} TSMatrix(T);}void TSMatrix_add(TSMatrix M,TSMatrix T,TSMatrix &ADD) /*求矩阵的和*/ {int a=1,b=1,c=1,x;ADD.mu=M.mu;ADD.nu=M.nu;ADD.tu=0;for(x=1;x<=M.mu;x++){while(M.data[a].i==x&&T.data[b].i==x){if(M.data[a].j==T.data[b].j){ADD.data[c].i=M.data[a].i;ADD.data[c].j=M.data[a].j;ADD.data[c].e=M.data[a].e+T.data[b].e;c++;a++;b++;}else if(M.data[a].j<T.data[b].j){ADD.data[c].i=M.data[a].i;ADD.data[c].j=M.data[a].j;ADD.data[c].e=M.data[a].e;c++;a++;}else{ADD.data[c].i=T.data[b].i;ADD.data[c].j=T.data[b].j;ADD.data[c].e=T.data[b].e;c++;b++;}}while(M.data[a].i==x){ADD.data[c].i=M.data[a].i;ADD.data[c].j=M.data[a].j;ADD.data[c].e=M.data[a].e;c++;a++;while(T.data[b].i==x){ADD.data[c].i=T.data[b].i;ADD.data[c].j=T.data[b].j;ADD.data[c].e=T.data[b].e;c++;b++;}}ADD.tu=c-1;}void ShowMatrix(TSMatrix &M) /*打印出矩阵*/ {int i=1,j=1,dir=1;//printf("稀疏矩阵为:\n");for(i=1;i<=M.mu;i++){for(j=1;j<=M.nu;j++){if(M.data[dir].i==i && M.data[dir].j==j) {printf("%d ",M.data[dir].e);dir++;}elseprintf("0 ");}printf("\n");}void main(){while(1){int c;M.mu=0;M.nu=0;M.tu=0;printf("1.创建一个稀疏矩阵A:\n");printf("2.求转置矩阵A:\n");printf("3.创建一个稀疏矩阵B:\n");printf("4.求转置矩阵B:\n");printf("5.求A与B原矩阵的和:\n"); while (1){printf("请按键选择:");scanf("%d",&c);switch(c){case 1:CreateMatrix(M) ;break;case 2:FastTransposeSMatrix(M);printf("原矩阵A为:\n");ShowMatrix(M);printf("转置矩阵为:\n"); ShowMatrix(T);break;case 3:CreateMatrix(B) ;break;case 4:FastTransposeSMatrix(B);printf("原矩阵B为:\n");ShowMatrix(B);printf("转置矩阵为:\n");ShowMatrix(T);break;case 5:FastTransposeSMatrix(M);TSMatrix_add(M,B,S);printf("A与B原矩阵的和为:\n");ShowMatrix(S);break;return 0;}}}}5.结果分析(1)选择选项1,创建矩阵A;选择选项2,转置矩阵A。

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

实现稀疏矩阵(采用三元组表示)的基本运算实验报告
一实验题目: 实现稀疏矩阵(采用三元组表示)的基本运算二实验要求:
(1)生成如下两个稀疏矩阵的三元组 a 和 b;(上机实验指导 P92 )(2)输出 a 转置矩阵的三元组;
(3)输出a + b 的三元组;
(4)输出 a * b 的三元组;
三实验内容:
稀疏矩阵的抽象数据类型:
ADT SparseMatrix {
数据对象:D={aij| i = 1,2,3,….,m; j =1,2,3,……,n;
ai,j∈ElemSet,m和n分别称为矩阵的行数和列数}
数据关系: R={ Row , Col }
Row ={<ai,j ,ai,j+1> | 1≤i≤m , 1≤j ≤n-1}
Col ={<a i,j , a i+1,j >| 1≤i≤m-1,1≤j ≤n}
基本操作:
CreateSMatrix(&M)
操作结果:创建稀疏矩阵 M PrintSMatrix(M)
初始条件:稀疏矩阵M已经存在
操作结果:打印矩阵M DestroySMatrix(&M)
初始条件:稀疏矩阵M已经存在
操作结果:销毁矩阵M CopySMatrix(M, &T)
初始条件:稀疏矩阵M已经存在
操作结果:复制矩阵M到T
AddSMatrix(M, N, &Q)
初始条件:稀疏矩阵M、N已经存在
操作结果:求矩阵的和Q=M+N
SubSMatrix(M, N, &Q)
初始条件:稀疏矩阵M、N已经存在
操作结果:求矩阵的差Q=M-N TransposeSMatrix(M, & T)
初始条件:稀疏矩阵M已经存在
操作结果:求矩阵M的转置T MultSMatrix(M, N, &Q)
初始条件:稀疏矩阵M已经存在
操作结果:求矩阵的积Q=M*N
}ADT SparseMatrix
存储结构的定义
#define N 4
typedef int ElemType;
#define MaxSize 100 =i;[].c=j;
[].d=A[i][j];++;
}
}
}
void DispMat(TSMatrix t)
{
int i;
if <=0)
return;
printf("\t%d\t%d\t%d\n",,,;
printf("\t------------------\n");
for (i=0;i<;i++)
printf("\t%d\t%d\t%d\n",[i].r,[i].c,[i].d); }
解题思路:
1.转置矩阵:只要判定原矩阵有值,那么只要遍历一遍原矩阵,把原来矩阵中非0元素行列变换一下赋值到新的矩阵中即可。

2.矩阵加法:用各种 if 判断,区分出矩阵进行加法时的可能情况,分情况处理即可。

3.矩阵乘法:通过 getvalue(c , i, j)函数查找矩阵c 中i 行j列,所储存的元素的值。

然后便是模拟矩阵乘法的过程进行求解。

解题过程:
实验源代码如下:
顺序表的各种运算
#include <>
#define N 4
typedef int ElemType;
#define MaxSize 100 =i;[].c=j;
[].d=A[i][j];++;
}
}
}
void DispMat(TSMatrix t){
int i;
if <=0)
return;
printf("\t%d\t%d\t%d\n",,,;
printf("\t------------------\n");
for (i=0;i<;i++)
printf("\t%d\t%d\t%d\n",[i].r,[i].c,[i].d); }
void TranMat(TSMatrix t,TSMatrix &tb){
int p,q=0,v; ==v)
{
[q].r=[p].c;
[q].c=[p].r;
[q].d=[p].d;
q++;
}
}
}
bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c){ int i=0,j=0,k=0;
ElemType v;
if != || !=
return false; ==[j].r) <[j].c) =[i].r;=[i].c;
[k].d=[i].d;
k++;i++;
}
else if [i].c>[j].c)=[j].r; =[j].c;
[k].d=[j].d;
k++;j++;
}
else +[j].d;
if (v!=0) =[i].r;
[k].c=[i].c;
[k].d=v;
k++;
}
i++;j++;
}
}
else if [i].r<[j].r) =[i].r; =[i].c;
[k].d=[i].d;
k++;i++;
}
else =[j].r; =[j].c;
[k].d=[j].d;
k++;j++;
}
=k;
}
return true;
}
int getvalue(TSMatrix c,int i,int j)
{
int k=0;
while (k< && [k].r!=i || [k].c!=j))
k++;
if (k<
return[k].d);
else
return(0);
}
bool MatMul(TSMatrix a,TSMatrix b,TSMatrix &c) {
int i,j,k,p=0;
ElemType s;
if != =i;
[p].c=j;
[p].d=s;
p++;
}
}
=;
=;
=p;
return true;
}
int main()
{
ElemType a1[N][N]={ {1,0,3,0},
{0,1,0,0},
{0,0,1,0},
{0,0,1,1}};
ElemType b1[N][N]={ {3,0,0,0},
{0,4,0,0},
{0,0,1,0},
{0,0,0,2}};
TSMatrix a,b,c;
CreatMat(a,a1); CreatMat(b,b1);
printf("a的三元组:\n");DispMat(a);
printf("b的三元组:\n");DispMat(b);
printf("a转置为c\n");
TranMat(a,c);
printf("c的三元组:\n");DispMat(c);
printf("c=a+b\n");
MatAdd(a,b,c);
printf("c的三元组:\n");DispMat(c);
printf("c=a×b\n");
MatMul(a,b,c);
printf("c的三元组:\n");DispMat(c);
return 0;
}
四实验结果。

相关文档
最新文档