文档视界 最新最全的文档下载
当前位置:文档视界 › 矩阵转置及相加实验报告重点讲义资料

矩阵转置及相加实验报告重点讲义资料

矩阵转置及相加实验报告重点讲义资料
矩阵转置及相加实验报告重点讲义资料

一、实验内容和要求

1、稀疏矩阵A,B均采用三元组表示,验证实现矩阵A快速转置算法,设计并验证A,B相

加得到矩阵C的算法。

(1)从键盘输入矩阵的行数和列数,随机生成稀疏矩阵。

(2)设计算法将随机生成的稀疏矩阵转换成三元组顺序表示形式存储。

(3)设计算法将快速转置得到的与相加得到的三元组顺序表分别转换成矩阵形式。

(4)输出随机生成的稀疏矩阵A,B及其三元组顺序表、快速转置得到的与相加得到的三元组顺序表及其矩阵形式。

二、实验过程及结果

一、需求分析

1、将随机生成的数定义为int型(为方便起见设定范围为-20至20(不含0),可

修改),三元组存储的元素分别为非零元的行下标、列下标及该位置的元素值,零元不进行存储。实际上在生成稀疏矩阵时是随机选取一些位置生成非零元然后存入三元组中。

2、从键盘输入矩阵的行数和列数后应能输出三元组顺序表及相应矩阵(按行和列

排列形式输出)。

3、程序能实现的功能包括:

①随机产生稀疏矩阵;②输出阵列形式的矩阵;③输出三元组顺序

表;④将矩阵快速转置;⑤将两个稀疏矩阵相加生成新的矩阵。

二、概要设计

1、稀疏矩阵的抽象数据类型定义:

ADT TSMatrix{

数据对象:D={ aij|i=1,2,…,m,j=1,2,…,n;

Ai,j∈ElemSet,m和n分别称为矩阵的行数和列数}数据关系:R={Row,Col}

Row={|1≤i≤m, 1≤j≤n-1}

Col ={|1≤i≤m-1, 1≤j≤n}

基本操作:

CreateTSMatrix(&M)

操作结果:创建矩阵M

PrintTSMatrix(M)

初始条件:矩阵M已存在

操作结果:输出矩阵M中三元组形式的非零元素

PrintTSMatrix1(M)

初始条件:矩阵M已存在

操作结果:以阵列形式输出矩阵

UnZore(M, row, col)

初始条件:矩阵M已存在

操作结果:若位置(row,col)处存在非零元素,则返回该元素存储在矩阵中的序号

TSMatrix_Add(M, N,&Q)

初始条件:矩阵M,N已存在

操作结果:将矩阵M,N相加得到Q并返回矩阵Q

FastTransposeSMatrix(M,&N)

初始条件:矩阵M已存在

操作结果:将矩阵M快速转置得到转置矩阵N并返回

}ADT TSMatrix;

⒊本程序模块结构

⑴主函数模块

void main(){

初始化迷矩阵;

创建矩阵并输出;

将矩阵转置并输出;

将矩阵相加并输出结果;

三、详细设计

1、基本数据类型操作

⑴typedef int ElemType;

typedef struct{

int i,j;

ElemType e;

}Triple;//数据类型三元组

typedef struct{

Triple data[maxsize+1];//矩阵大小

int mu,nu,tu; //

}TSMatrix;//矩阵抽象数据类型

2、参数设置:

#define maxsize 10000

//----------基本操作的算法描述--------------------

Status CreateTSMatrix(TSMatrix *M){

//创建一个随机矩阵(data[0]未用)

srand((int)time(NULL));

printf("Please Input The Lines And Columns Of The Matrix:\n");

printf("...(矩阵的期望规格大于4*5(或5*4))...\n");

scanf(M->mu,M->nu);

for(m=0;mmu;m++){

for(n=0;nnu;n++){

k[m][n]=rand()%20;

if(k[m][n]==0){

if(rand()%2)

M->data[p].e=rand()%20+1;

else

M->data[p].e=rand()%20-20;

M->data[p].i=m+1;

M->data[p].j=n+1;

p++;

}

}

}

M->tu=p-1; //p从1开始,非零元个数刚好等于p-1

return OK;

}

void PrintTSMatrix(TSMatrix M){

//输出矩阵的三元组顺序表

if(M.tu==0)

printf("无非零元!\n");

else{

printf("该矩阵的行数为%d、列数为%d、非零元素个数为%d.\n非零元的坐标及值:\n\n",M.mu,M.nu,M.tu);

printf(" 行列元素值\n");

for(i=1;i<=M.tu;i++){

printf("%4d%4d%6d\n",M.data[i].i,M.data[i].j,M.data[i].e);

}

printf("\n");

}

}

void PrintTSMatrix1(TSMatrix M){

//输出矩阵的阵列形式

printf("阵列形式为:\n");

for(i=1;i<=M.mu;i++){

for(j=1;j<=M.nu;j++)

if (ki==i&&p->j==j){

printf("%4d",p->e); //data[0]未用,p从data[1]开始

p++;

k++;

}

else

printf("%4d",0);

printf("\n");

}

printf("\n");

}

int UnZore(TSMatrix M,int row,int col){

while(order<=M.tu){

if(M.data[order].i==row&&M.data[order].j==col)//order从1开始return order;

order++;

}

return 0;

}

Status TSMatrix_Add(TSMatrix M,TSMatrix N,TSMatrix *Q){

//矩阵相加得到新的矩阵,order从1开始

if(M.mu==N.mu&&M.nu==N.nu){

for(row=1;row<=M.mu;row++){

for(col=1;col<=M.nu;col++){

order1=UnZore(M,row,col);

order2=UnZore(N,row,col);

if(order1&&order2){

Q->data[order].i=row;

Q->data[order].j=col;

Q->data[order].e=M.data[order1].e+N.data[order2].e;

order++;

}

else if(order1&&(!order2)){

Q->data[order].e=M.data[order1].e;

Q->data[order].i=M.data[order1].i;

Q->data[order].j=M.data[order1].j;

order++;

}

else if((!order1)&&order2){

Q->data[order].e=N.data[order2].e;

Q->data[order].i=N.data[order2].i;

Q->data[order].j=N.data[order2].j;

order++;

}

}

}

Q->mu=M.mu;

Q->nu=M.nu;

Q->tu=order-1;

return OK;

}

else{

printf("\n不是同型矩阵不能进行相加!\n");

return ERROR;

}

}

Status FastTransposeSMatrix(TSMatrix M,TSMatrix *N){

//采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵N

N->mu=M.nu;

N->nu=M.mu;

N->tu=M.tu;

if(N->tu){

for(i=1;i<=M.nu;++i)

num[i]=0;

for(t=1;t<=M.tu;++t)

++num[M.data[t].j];//求M中每一列非零元个数 cpot[1]=1;

//求第col列中第一个元素在b.data中的序号

for(i=2;i<=M.nu;++i)

cpot[i]=cpot[i-1]+num[i-1];

for(p=1;p<=M.tu;++p){

i=M.data[p].j;

q=cpot[i];

N->data[q].i=M.data[p].j;

N->data[q].j=M.data[p].i;

N->data[q].e=M.data[p].e;

++cpot[i];

}

}

return OK;

}

⑶主函数算法:

void main(){

TSMatrix A,A1,B,C;

printf("矩阵A:\n");

CreateTSMatrix(&A);

PrintTSMatrix(A);

PrintTSMatrix1(A);

printf("由矩阵A转置得矩阵A1...\n");

FastTransposeSMatrix(A,&A1);

PrintTSMatrix(A1);

PrintTSMatrix1(A1);

printf("矩阵B:\n");

CreateTSMatrix(&B);

PrintTSMatrix(B);

PrintTSMatrix1(B);

printf("矩阵A加矩阵B得到矩阵C...\n");

if(TSMatrix_Add(A,B,&C)){

PrintTSMatrix(C);

PrintTSMatrix1(C);

}

}

四、调试分析

1、三元组顺序表的输出顺序应该是先按行排序再按列排序,即行主序,依次输出。

2、生成的非零元应该有正数和负数,选取在-20到20之间的数(不包括0),生成随机数时同时随机生成其正负号,为正数时将rand()%20再加1,避免再产生0,为负数时将rand()%20-20。

3、由于稀疏矩阵非零元个数极少,故要求矩阵规格在4*5(或5*4)以上为好,实际上生成非零元时其位置具备随机性,其个数也具备随机性,并不严格小于等于矩阵元素个数的5%,因为控制其随机位置的是通过rand()%20,当该随机数值为0时,将该位置做为非零元位置。开始时采取随机生成位置以便控制非零元个数小于等于矩阵元素个数的5%,但是这样就不便于将非零元按行列次序存储,而是谁先生成就先存储谁,也无法避免出现重复位置的情况。

4、实验没有采取二维数组的方法来形成矩阵,而是直接用三元组存储的,在输出时通过for循环控制则可输出实现阵列形式的矩阵。

三、用户说明与测试结果

1、本程序的运行环境为windows 7(64位)操作系统,执行文件为矩阵.exe;

2、进入演示程序后,即显示对话形式的提示操作过程,

(1)提出输入矩阵的大小

(2)按enter键输出随机生成的矩阵三元组顺序表和整个矩阵

如图所示:

(3)程序自动完成第一个矩阵的转置并输出;

(4)提示输入矩阵B后,用户输入所需矩阵的行数和列数,然后程序将自动完成两个原始矩阵的相加,若不是同型矩阵则提示无法相加。

如图所示:

五、附录(源代码及注释)

#include

#include

#include "time.h"

#define maxsize 10000

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define OVERFLOW -1

typedef int ElemType;

typedef int Status;

typedef struct{

int i,j;

ElemType e;

}Triple;//数据类型三元组

typedef struct{

Triple data[maxsize+1];//矩阵大小

int mu,nu,tu; //

}TSMatrix;//矩阵抽象数据类型

Status CreateTSMatrix(TSMatrix *M); //创建矩阵

void PrintTSMatrix(TSMatrix M); //输出矩阵非零元素

void PrintTSMatrix1(TSMatrix M); //以阵列形式输出矩阵

int UnZore(TSMatrix M,int row,int col); //判断位置(row,col)是否存在非零元素Status TSMatrix_Add(TSMatrix M,TSMatrix N,TSMatrix *Q); //将矩阵M,N相加得到Q Status FastTransposeSMatrix(TSMatrix M,TSMatrix *N); //快速转置

void main()

{

TSMatrix A,A1,B,C;

printf("矩阵A:\n");

CreateTSMatrix(&A);

PrintTSMatrix(A);

PrintTSMatrix1(A);

printf("由矩阵A转置得矩阵A1...\n");

FastTransposeSMatrix(A,&A1);

PrintTSMatrix(A1);

PrintTSMatrix1(A1);

printf("矩阵B:\n");

CreateTSMatrix(&B);

PrintTSMatrix(B);

PrintTSMatrix1(B);

printf("矩阵A加矩阵B得到矩阵C...\n");

if(TSMatrix_Add(A,B,&C)){

PrintTSMatrix(C);

PrintTSMatrix1(C);

}

}

Status CreateTSMatrix(TSMatrix *M){

int m,n,p=1,num; //data[0]未用,p从1开始;num为非零元个数最大值int k[100][100];

srand((int)time(NULL));

printf("Please Input The Lines And Columns Of The Matrix:\n");

printf("...(矩阵的期望规格大于4*5(或5*4))...\n");

printf("The Line Number:");

scanf("%d",&M->mu);

printf("The Column Number:");

scanf("%d",&M->nu);

/*

for(m=1;m<=M->mu;m++)

for(n=1;n<=M->nu;n++)

k[m][n]=0;

num=(m*n)/20;

printf("%d",num);

for(p=1;p<=num;p++){

m=rand()%M->mu+1;

n=rand()%M->nu+1;

if(rand()%2==1)

k[m][n]=rand()%20+1;

else if(rand()%2==0)

k[m][n]=rand()%20-20;

}

for(m=1;m<=M->mu;m++){

for(n=1;n<=M->nu;n++){

if(k[m][n]!=0){

M->data[p].e=k[m][n];

M->data[p].i=m;

M->data[p].j=n;

p++;

}

}

}

*/

for(m=0;mmu;m++){

for(n=0;nnu;n++){

k[m][n]=rand()%20;

if(k[m][n]==0){

if(rand()%2)

M->data[p].e=rand()%20+1;

else

M->data[p].e=rand()%20-20;

M->data[p].i=m+1;

M->data[p].j=n+1;

p++;

}

}

}

M->tu=p-1; //p从1开始,刚好等于非零元个数-1

return OK;

}

void PrintTSMatrix(TSMatrix M){

int i;

if(M.tu==0)

printf("无非零元!\n");

else{

printf("该矩阵的行数为%d、列数为%d、非零元素个数为%d.\n非零元的坐标及值:\n\n",M.mu,M.nu,M.tu);

printf(" 行列元素值\n");

for(i=1;i<=M.tu;i++){

printf("%4d%4d%6d\n",M.data[i].i,M.data[i].j,M.data[i].e);

}

printf("\n");

}

}

void PrintTSMatrix1(TSMatrix M){

int i,j,k=0;

Triple *p=M.data;

p++; //data[0]未用,从data[1]开始

printf("阵列形式为:\n");

for(i=1;i<=M.mu;i++){

for(j=1;j<=M.nu;j++)

if (ki==i&&p->j==j){

printf("%4d",p->e);

p++;

k++;

}

else

printf("%4d",0);

printf("\n");

}

printf("\n");

}

int UnZore(TSMatrix M,int row,int col){

int order=1; //data[0]未用

while(order<=M.tu){

if(M.data[order].i==row&&M.data[order].j==col)

return order;

order++;

}

return 0;

}

Status TSMatrix_Add(TSMatrix M,TSMatrix N,TSMatrix *Q){

int row,col;

int order=1,order1,order2; //data[0]未用

if(M.mu==N.mu&&M.nu==N.nu){

for(row=1;row<=M.mu;row++){

for(col=1;col<=M.nu;col++){

order1=UnZore(M,row,col);

order2=UnZore(N,row,col);

if(order1&&order2){

Q->data[order].i=row;

Q->data[order].j=col;

Q->data[order].e=M.data[order1].e+N.data[order2].e;

order++;

}

else if(order1&&(!order2)){

Q->data[order].e=M.data[order1].e;

Q->data[order].i=M.data[order1].i;

Q->data[order].j=M.data[order1].j;

order++;

}

else if((!order1)&&order2){

Q->data[order].e=N.data[order2].e;

Q->data[order].i=N.data[order2].i;

Q->data[order].j=N.data[order2].j;

order++;

}

}

}

Q->mu=M.mu;

Q->nu=M.nu;

Q->tu=order-1;

return OK;

}

else{

printf("\n不是同型矩阵不能进行相加!\n");

return ERROR;

}

}

Status FastTransposeSMatrix(TSMatrix M,TSMatrix *N){ int i,t,p,q,num[100],cpot[100];

N->mu=M.nu;

N->nu=M.mu;

N->tu=M.tu;

if(N->tu){

for(i=1;i<=M.nu;++i)

num[i]=0;

for(t=1;t<=M.tu;++t)

++num[M.data[t].j];

cpot[1]=1;

for(i=2;i<=M.nu;++i)

cpot[i]=cpot[i-1]+num[i-1];

for(p=1;p<=M.tu;++p){

i=M.data[p].j;

q=cpot[i];

N->data[q].i=M.data[p].j;

N->data[q].j=M.data[p].i;

N->data[q].e=M.data[p].e;

++cpot[i];

}

}

return OK;

}

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

实现稀疏矩阵(采用三元组表示)的基本运算实验报告 一实验题目: 实现稀疏矩阵(采用三元组表示)的基本运算二实验要求: (1)生成如下两个稀疏矩阵的三元组a 和b;(上机实验指导P92 )(2)输出a 转置矩阵的三元组; (3)输出a + b 的三元组; (4)输出a * b 的三元组; 三实验内容: 3.1 稀疏矩阵的抽象数据类型: ADT SparseMatrix { 数据对象:D={aij| i = 1,2,3,….,m; j =1,2,3,……,n; ai,j∈ElemSet,m和n分别称为矩阵的行数和列数 } 数据关系 : R={ Row , Col } Row ={ | 1≤ i≤m , 1≤ j≤ n-1} Col ={| 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 3.2存储结构的定义 #define N 4 typedef int ElemType; #define MaxSize 100 //矩阵中非零元素最多个数typedef struct { int r; //行号 int c; //列号 ElemType d; //元素值 } TupNode; //三元组定义 typedef struct { int rows; //行数值 int cols; //列数值 int nums; //非零元素个数

矩阵分析实验报告

矩 阵 分 析 实 验 报 告 学院:电气学院 专业:控制工程 姓名:XXXXXXXX 学号:211208010001

矩阵分析实验报告 实验题目 利用幂法求矩阵的谱半径 实验目的与要求 1、 熟悉matlab 矩阵实验室的功能和作用; 2、 利用幂法求矩阵的谱半径; 3、 会用matlab 对矩阵分析运算。 实验原理 理念 谱半径定义:设n n A C ?∈,1λ,2λ,3λ, ,j λ, n λ是A 的n 个特征值,称 ()max ||j j A ρλ= 为关于A 的谱半径。 关于矩阵的谱半径有如下结论: 设n n A C ?∈,则 (1)[]()()k k A A ρρ=; (2)2 2()()()H H A A AA A ρρ==。 由于谱半径就是矩阵的主特征值,所以实验换为求矩阵的主特征值。 算法介绍 定义:如果1λ是矩阵A 的特征值,并且其绝对值比A 的任何其他特征值的绝对值大,则称它为主特征值。相应于主特征值的特征向量1V 称为主特征向量。 定义:如果特征向量中最大值的绝对值等于单位值(例如最大绝对值为1),则称其为是归一化的。

通过形成新的向量' 12=c n V (1/)[v v v ],其中c=v 且1max {},j i n i ≤≤=v v 可将特 征向量 '12n [v v v ]进行归一化。 设矩阵A 有一主特征值λ,而且对应于λ有唯一的归一化特征向量V 。通过下面这个称为幂法(power method )的迭代过程可求出特征对λ,V ,从下列向量开始: []' 0=111X (1) 用下面递归公式递归地生成序列{}k X : k k Y AX = k+11 1 k k X Y c += (2) 其中1k c +是k Y 绝对值最大的分量。序列{}k X 和{}k c 将分别收敛到V 和λ: 1lim k X V =和lim k c λ= (3) 注:如果0X 是一个特征向量且0X V ≠,则必须选择其他的初始向量。 幂法定理:设n ×n 矩阵A 有n 个不同的特征值λ1,λ2,···,,λn ,而且它们按绝对 值大小排列,即: 123n λλλλ≥≥≥???≥ (4) 如果选择适当的X 0,则通过下列递推公式可生成序列{[() ()( ) ]}12k k k k n X x x x '=???和 {}k c : k k Y AX = (5) 和: 11 1k k k X Y c ++= (6) 其中: () 1k k j c x +=且{} ()()1max k k j i i n x x ≤≤= (7) 这两个序列分别收敛到特征向量V 1和特征值λ1。即: 1lim k k X V →∞ =和1lim k k c λ→∞ = (8) 算法收敛性证明 证明:由于A 有n 个特征值,所以有对应的特征向量V j ,j=1,2,···n 。而且它们是

矩阵特征值实验报告

一、课题名称 Malab矩阵特征值 二、目的和意义 1、求矩阵的部分特征值问题具有重要实际意义,如求矩阵谱半径()Aρ=maxλ,稳定性问题往往归于求矩阵按模最小特征值; 2、进一步掌握冪法、反冪法及原点平移加速法的程序设计技巧; 3、问题中的题(5),反应了利用原点平移的反冪法可求矩阵的任何特征值及其特征向量。 三、实验要求 1、掌握冪法或反冪法求矩阵部分特征值的算法与程序设计; 2、会用原点平移法改进算法,加速收敛;对矩阵B=A-PI取不同的P值,试求其效果; 3、试取不同的初始向量,观察对结果的影响;()0υ 4、对矩阵特征值的其它分布,如如何计算。 四、问题描述 五、实验程序设计 幂法 function [lamdba,v]=power_menthod(a,x,epsilon,maxl)

k=0; y=a*x; while(k> a=[-1 2 1;2 -4 1;1 1 -6]; >> x=[1 1 1]'; >> epsilon=0.00005; >> maxl=20; >> power_menthod(a,x,epsilon,maxl) lambda = 6.4183 v = -0.0484 -0.3706 1.0000 方程组2结果 >> a=[4 -2 7 3 -1 8;-2 5 1 1 4 7;7 1 7 2 3 5;3 1 2 6 5 1;-1 4 3 5 3 2;8 7 5 1 2 4]; >> x=[1 0 1 0 0 1]'; >> epsilon=0.00005; >> maxl=20; >> power_menthod(a,x,epsilon,maxl) lambda = 21.3053 v = 0.8724 0.5401 0.9974 0.5644 0.4972 1.0000 反幂法 function [lambda,v]=INV_shift(a,x,epsilon,max1)

矩阵转置及相加实验报告

一、实验内容和要求 1、稀疏矩阵A,B均采用三元组表示,验证实现矩阵A快速转置算法,设计并验证A,B相 加得到矩阵C的算法。 (1)从键盘输入矩阵的行数和列数,随机生成稀疏矩阵。 (2)设计算法将随机生成的稀疏矩阵转换成三元组顺序表示形式存储。 (3)设计算法将快速转置得到的与相加得到的三元组顺序表分别转换成矩阵形式。 (4)输出随机生成的稀疏矩阵A,B及其三元组顺序表、快速转置得到的与相加得到的三元组顺序表及其矩阵形式。 二、实验过程及结果 一、需求分析 1、将随机生成的数定义为int型(为方便起见设定范围为-20至20(不含0),可 修改),三元组存储的元素分别为非零元的行下标、列下标及该位置的元素值,零元不进行存储。实际上在生成稀疏矩阵时是随机选取一些位置生成非零元然后存入三元组中。 2、从键盘输入矩阵的行数和列数后应能输出三元组顺序表及相应矩阵(按行和列 排列形式输出)。 3、程序能实现的功能包括: ①随机产生稀疏矩阵;②输出阵列形式的矩阵;③输出三元组顺序 表;④将矩阵快速转置;⑤将两个稀疏矩阵相加生成新的矩阵。 二、概要设计 1、稀疏矩阵的抽象数据类型定义: ADT TSMatrix{ 数据对象:D={ aij|i=1,2,…,m,j=1,2,…,n; Ai,j∈ElemSet,m和n分别称为矩阵的行数和列数}数据关系:R={Row,Col} Row={|1≤i≤m, 1≤j≤n-1} Col ={|1≤i≤m-1, 1≤j≤n} 基本操作: CreateTSMatrix(&M) 操作结果:创建矩阵M PrintTSMatrix(M) 初始条件:矩阵M已存在 操作结果:输出矩阵M中三元组形式的非零元素 PrintTSMatrix1(M) 初始条件:矩阵M已存在 操作结果:以阵列形式输出矩阵 UnZore(M, row, col) 初始条件:矩阵M已存在 操作结果:若位置(row,col)处存在非零元素,则返回该元素存储在矩阵中的序号

矩阵键盘设计实验报告

南京林业大学 实验报告 基于AT89C51 单片机4x4矩阵键盘接口电路设计 课程机电一体化设计基础 院系机械电子工程学院 班级 学号 姓名

指导老师杨雨图 2013年9月26日

一、实验目的 1、掌握键盘接口的基本特点,了解独立键盘和矩 阵键盘的应用方法。 2、掌握键盘接口的硬件设计方法,软件程序设计 和贴士排错能力。 3、掌握利用Keil51软件对程序进行编译。 4、用Proteus软件绘制“矩阵键盘扫描”电路,并用测试程序进行仿真。 5、会根据实际功能,正确选择单片机功能接线,编制正确程序。对实验结果 能做出分析和解释,能写出符合规格的实验报告。 二、实验要求 通过实训,学生应达到以下几方面的要求: 素质要求 1.以积极认真的态度对待本次实训,遵章守纪、团结协作。 2.善于发现数字电路中存在的问题、分析问题、解决问题,努力培养独立 工作能力。 能力要求 1.模拟电路的理论知识 2.脉冲与数字电路的理念知识 3.通过模拟、数字电路实验有一定的动手能力 4.能熟练的编写8951单片机汇编程序 5.能够熟练的运用仿真软件进行仿真 三、实验工具 1、软件:Proteus软件、keil51。 2、硬件:PC机,串口线,并口线,单片机开发板 四、实验内容

1、掌握并理解“矩阵键盘扫描”的原理及制作,了解各元器件的参数及格 元器件的作用。 2、用keil51测试软件编写AT89C51单片机汇编程序 3、用Proteus软件绘制“矩阵键盘扫描”电路原理图。 4、运用仿真软件对电路进行仿真。 五.实验基本步骤 1、用Proteus绘制“矩阵键盘扫描”电路原理图。 2、编写程序使数码管显示当前闭合按键的键值。 3、利用Proteus软件的仿真功能对其进行仿真测试,观察数码管的显示状 态和按键开关的对应关系。 4、用keil51软件编写程序,并生成HEX文件。 5、根据绘制“矩阵键盘扫描”电路原理图,搭建相关硬件电路。 6、用通用编程器或ISP下载HEX程序到MCU。 7、检查验证结果。 六、实验具体内容 使用单片机的P1口与矩阵式键盘连接时,可以将P1口低4位的4条端口线定义为行线,P1口高4位的4条端口线定义为列线,形成4*4键盘,可以配置16个按键,将单片机P2口与七段数码管连接,当按下矩阵键盘任意键时,数码管显示该键所在的键号。 1、电路图

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

教学单位计算机科学与技术 学生学号 5 数据结构 课程设计报告书 题目稀疏矩阵运算器 学生豹 专业名称软件工程 指导教师志敏

实验目的:深入研究数组的存储表示和实现技术,熟悉广义表存储结构的特性。 需要分析:稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。要求以带“行逻辑信息”的三元组顺序表存储稀疏矩阵,实现两矩阵的相加、相减、相乘等运算。输入以三元组表示,输出以通常的阵列形式列出。 软件平台:Windows 2000,Visual C++ 6.0或WINTC 概要设计:ADT Array { 数据对象: D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1} 数据关系: R = { ROW, COL } ROW = {| 0≤i≤b1-2, 0≤j≤b2-1} COL = {| 0≤i≤b1-1, 0≤ j≤b2-2} 基本操作: CreateSMatrix(&M); //操作结果:创建稀疏矩阵M. Print SMatrix(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*N. } ADT Array

矩阵乘法的并行化 实验报告

北京科技大学计算机与通信工程学院 实验报告 实验名称: 学生姓名: 专业: 班级: 学号: 指导教师: 实验成绩:________________________________ 实验地点: 实验时间:2015年05月

一、实验目的与实验要求 1、实验目的 1对比矩阵乘法的串行和并行算法,查看运行时间,得出相应的结论;2观察并行算法不同进程数运行结果,分析得出结论; 2、实验要求 1编写矩阵乘法的串行程序,多次运行得到结果汇总; 2编写基于MPI,分别实现矩阵乘法的并行化。对实现的并行程序进行正确性测试和性能测试,并对测试结果进行分析。 二、实验设备(环境)及要求 《VS2013》C++语言 MPICH2 三、实验内容与步骤 实验1,矩阵乘法的串行实验 (1)实验内容 编写串行程序,运行汇总结果。 (2)主要步骤 按照正常的矩阵乘法计算方法,在《VS2013》上编写矩阵乘法的串行程序,编译后多次运行,得到结果汇总。

实验2矩阵乘法的并行化实验 3个总进程

5个总进程 7个总进程

9个进程 16个进程 四:实验结果与分析(一)矩阵乘法并行化

矩阵并行化算法分析: 并行策略:1间隔行带划分法 算法描述:将C=A*B中的A矩阵按行划分,从进程分得其中的几行后同时进行计算,最后通信将从进程的结果合并的主进程的C矩阵中 对于矩阵A*B 如图:进程1:矩阵A第一行 进程2:矩阵A第二行 进程3:矩阵A第三行 进程1:矩阵A第四行 时间复杂度分析: f(n) =6+2+8+k*n+k*n+k*n+3+10+n+k*n+k*n+n+2 (k为从进程分到的行数) 因此O(n)=(n); 空间复杂度分析: 从进程的存储空间不共用,f(n)=n; 因此O(n)=(n); 2间隔行带划分法 算法描述:将C=A*B中的A矩阵按行划分,从进程分得其中的几行后同时进行计算,最后通信将从进程的结果合并的主进程的C矩阵中 对于矩阵A*B 如图:进程1:矩阵A第一行 进程2:矩阵A第二行 进程3:矩阵A第三行 进程3:矩阵A第四行 时间复杂度分析: f(n) =6+2+8+k*n+k*n+k*n+3+10+n+k*n+k*n+n+2 (k为从进程分到的行数) 因此O(n)=(n); 空间复杂度分析: 从进程的存储空间不共用,f(n)=n; 因此T(n)=O(n);

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

课程设计 课程:数据结构 题目:稀疏矩阵4 三元组单链表结构体(行数、列数、头) 矩阵运算重载运算符优 班级: 姓名: 学号: 设计时间:2010年1月17日——2010年5月XX日 成绩: 指导教师:楼建华

一、题目 二、概要设计 1.存储结构 typedef struct{ int row,col;//行,列 datatype v;//非0数值 }Node; typedef struct{ Node data[max];//稀疏矩阵 int m,n,t;//m 行,n 列,t 非0数个数 … … 2.基本操作 ⑴istream& operator >>(istream& input,Matrix *A)//输入 ⑵ostream& operator <<(ostream& output,Matrix *A){//输出 ⑶Matrix operator ~(Matrix a,Matrix b)//转置 ⑷Matrix operator +(Matrix a,Matrix b)//加法 ⑸Matrix operator -(Matrix a,Matrix b)//减法 ⑹Matrix operator *(Matrix a,Matrix b)//乘法 ⑺Matrix operator !(Matrix a,Matrix b)//求逆 三、详细设计 (1)存储要点 position[col]=position[col-1]+num[col-1]; 三元组表(row ,col ,v) 稀疏矩阵((行数m ,列数n ,非零元素个数t ),三元组,...,三元组) 1 2 3 4 max-1

数据结构三元组表存储结构实现稀疏矩阵应用课程方案实验报告

高二《数系的扩充与复数的概念》说课稿 高二《数系的扩充与复数的概念》说稿 《数系的扩充与复数的概念》是北师大版普通高中程标准数学实验教材选修1-2第四第一节的内容,大纲时安排一时。主要包括数系概念的发展简介,数系的扩充,复数相关概念、分类、相等条,代数表示和几何意义。 复数的引入是中学阶段数系的又一次扩充,引入复数以后,这不仅可以使学生对于数的概念有一个初步的、完整的认识,也为进一步学习数学打下了基础。通过本节学习,要使学生在问题情境中了解数系扩充的过程以及引入复数的必要性,学习复数的一些基本知识,体会人类理性思维在数系扩充中的作用。 在学习了这节以后,学生首先能知道数系是怎么扩充的,并且这种扩充是必要的,虚数单位公开《数系的扩充与复数的概念》说稿在数系扩充过程中的作用,而复数就是一个实数加上一个实数乘以公开《数系的扩充与复数的概念》说稿。学生能清楚的知道一个复数什么时候是虚数,什么时候是纯虚数,两个复数相等的充要条是什么。让学生在经历一系列的活动后,完成对知识的探索,变被动地“接受问题”为主动地“发现问题”,加强学生对知识应用的灵活性,深化学生对复数的认识,从而提高分析问题和解决问题的能力。 教学目标为:1.在问题情境中了解数系的扩充过程。体会实际需求与数学内部的矛盾(数的运算规则、方程求根)在数系扩充过程中的

作用,感受人类理性思维的作用以及数与现实世界的联系。. 2.理解复数的有关概念、数系间的关系、和几何表示。 3.掌握复数的分类和复数相等的条。 4体会类比、转化、数形结合思想在数学发现和解决数学问题中的作用。 教学重点为认识i的意义、复数的有关概念以及复数相等的条. 教学难点为复数相关概念的理解和复数的几何意义的理解 复数的概念是整个复数内容的基础,复数的有关概念都是围绕复数的代数表示形式展开的。虚数单位、实部、虚部的命名,复数想等的充要条,以及虚数、纯虚数等概念的理解,都应促进对复数实质的理解,即复数实际上是一有序实数对。类比实数可以用数轴表示,把复数在直角坐标系中表示出,就得到了复数的几何表示,这就把数和形有机的结合了起。 在学习本节的过程中,复数的概念如果单纯地讲解或介绍会显得较为枯燥无味,学生不易接受,教学时,采用讲解已学过的数集的扩充的历史,让学生体会到数系的扩充是生产实践的需要,也是数学学科自身发展的需要;介绍数的概念的发展过程,使学生对数的形成、发展的历史和规律,各种数集中之间的关系有着比较清晰、完整的认识从而让学生积极主动地建构虚数的概念、复数的概念、复数的分类。由于学生对数系扩充的知识不熟悉,对了解实数系扩充到复数系的过程有困难,也就是对虚数单位公开《数系的扩充与复数的概念》说稿的引入难以理解。另外虚数单位公开《数系的扩充与复数的概念》说

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

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

————————————————————————————————作者:————————————————————————————————日期: 2

实现稀疏矩阵(采用三元组表示)的基本运算实验报告 一实验题目: 实现稀疏矩阵(采用三元组表示)的基本运算二实验要求: (1)生成如下两个稀疏矩阵的三元组 a 和 b;(上机实验指导 P92 )(2)输出 a 转置矩阵的三元组; (3)输出a + b 的三元组; (4)输出 a * b 的三元组; 三实验内容: 3.1 稀疏矩阵的抽象数据类型: ADT SparseMatrix { 数据对象:D={aij| i = 1,2,3,….,m; j =1,2,3,……,n; ai,j∈ElemSet,m和n分别称为矩阵的行数和列数 } 数据关系 : R={ Row , Col } Row ={ | 1≤ i≤m , 1≤ j≤ n-1} Col ={| 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) 3

矩阵连乘实验报告

华北电力大学科技学院 实验报告 实验名称矩阵连乘问题 课程名称计算机算法设计与分析 专业班级:软件12K1 学生姓名:吴旭 学号:121909020124 成绩: 指导老师:刘老师实验日期:2014.11.14

一、实验内容 矩阵连乘问题,给定n个矩阵{A1,A2,…,A n},其中A i与A i+1是可乘的,i=1,2,3…,n-1。考察这n个矩阵的连乘A1,A2,…,A n。 二、主要思想 由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已经完全加括号,则可依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积。完全加括号的矩阵连乘积可递归的定义为: (1)单个矩阵是完全加括号的; (2)矩阵连乘积A是完全加括号的,则A可表示为2个完全加括号 的矩阵连乘积B和C的乘积并加括号,即A=(BC)。 运用动态规划法解矩阵连乘积的最优计算次序问题。按以下几个步骤进行 1、分析最优解的结构 设计求解具体问题的动态规划算法的第1步是刻画该问题的最优解的结构特征。为方便起见,将矩阵连乘积简记为A[i:j]。考察计算A[1:n]的最优计算次序。设这个计算次序矩阵在A k和A k+1之间将矩阵链断开,1n,则其相应的完全加括号方式为((A1…A k)(A k+1…A n))。依此次序,先计算A[1:k]和A[k+1:n],然后将计

算结果相乘得到A[1:n]。 2、建立递归关系 设计动态规划算法的第二步是递归定义最优值。对于矩阵连乘积的最优计算次序问题,设计算A[i:j],1i n,所需的最少数乘次数为m[i][j],原问题的最优值为m[1][n]。 当i=j时,A[i:j]=A i为单一矩阵,无需计算,因此m[i][i]=0,i=1,2,…n。 当i

MATLAB矩阵实验报告

MATLAB 程序设计实验 班级:电信1104班 姓名:龙刚 学号:1404110427 实验内容:了解MA TLAB 基本使用方法和矩阵的操作 一.实验目的 1.了解MA TLAB 的基本使用方法。 2.掌握MA TLAB 数据对象的特点和运算规则。 3.掌握MA TLAB 中建立矩阵的方法和矩阵的处理方法。 二.实验内容 1. 浏览MATLAB 的start 菜单,了解所安装的模块和功能。 2. 建立自己的工作目录,使用MA TLAB 将其设置为当前工作目录。使用path 命令和工作区浏览两种方法。 3. 使用Help 帮助功能,查询inv 、plot 、max 、round 等函数的用法和功能。使用help 命令和help 菜单。 4. 建立一组变量,如x=0:pi/10:2*pi ,y=sin(x),在命令窗口显示这些变量;在变量窗口打开这些变量,观察其值并使用绘图菜单绘制y 。 5. 分多行输入一个MA TLAB 命令。 6. 求表达式的值 ()6210.3424510w -=+? ()22tan b c a e abc x b c a ππ++ -+=++,a=3.5,b=5,c=-9.8 ()220.5ln 1t z e t t =++,21350.65i t -??=??-?? 7.已知 1540783617A --????=??????,831253320B -????=????-?? 求 A+6B ,A 2-B+I A*B ,A.*B ,B*A A/B ,B/A [A,B],[A([1,3], :); B^2]

8.已知 23100.7780414565532503269.5454 3.14A -????-??=????-?? 输出A 在[10,25]范围内的全部元素 取出A 的前三行构成矩阵B ,前两列构成矩阵C ,右下角3x2子矩阵构成矩阵D ,B 与C 的乘积构成矩阵E 分别求表达式E

稀疏矩阵(实验报告)

《数据结构课程设计》实验报告 一、实验目的: 理解稀疏矩阵的加法运算,掌握稀疏矩阵的存储方法,即顺序存储的方式,利用顺序存储的特点——每一个元素都有一个直接前驱和一个直接后继,完成相关的操作。 二、内容与设计思想: 1、设计思想 1)主界面的设计 定义两个矩阵a= 0 0 3 0 0 0 0 0 b= 0 2 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 定义两个数组A和B,用于存储矩阵a和矩阵b的值;定义一个数组C,用于存放数组A 和数组B相加后的结果。 2)实现方式 稀疏矩阵的存储比较浪费空间,所以我们可以定义两个数组A、B,采用压缩存储的方式来对上面的两个矩阵进行存储。具体的方法是,将非零元素的值和它所在的行号、列号作为一个结点存放在一起,这就唯一确定一个非零元素的三元组(i、j、v)。将表示稀疏矩阵的非零元素的三元组按行优先的顺序排列,则得到一个其结点均为三元组的线性表。即:以一维数组顺序存放非零元素的行号、列号和数值,行号-1作为结束标志。例如,上面的矩阵a,利用数组A存储后内容为: A[0]=0,A[1]=2, A[2]=3, A[3]=1, A[4]=6, A[5]=5, A[6]=3, A[7]=4, A[8]=7, A[9]=5, A[10]=1, A[11]=9, A[12]=-1 同理,用数组B存储矩阵b的值。 2、主要数据结构 稀疏矩阵的转存算法: void CreateMatrix(int A[m][n],int B[50]) { int i,j,k=0; for(i=0;i

数据结构实验报告(实验五 稀疏矩阵运算器)

韶关学院 学生实验报告册 实验课程名称:数据结构与算法 实验项目名称:实验五数组及其应用 稀疏矩阵运算器 实验类型(打√):(基础、综合、设计√) 院系:信息工程学院计算机系专业:***** 姓名:*** 学号:***** 指导老师:陈正铭 韶关学院教务处编制

一、实验预习报告内容

二、实验原始(数据)记录 实验时间:2007 年 5 月30日(星期三第7,8 节)实验同组人:

三、实验报告内容 2007年 5 月30 日

注:1、如有个别实验的实验报告内容多,实验报告册页面不够写,或有识图,画图要求的,学生应根据实验指导老师要求另附相同规格的纸张并粘贴在相应的“实验报告册”中。 2、实验报告册属教学运行材料,院系(中心)应按有关规定归档保管。

【源程序】 #include #include #include #define maxsize 100 #define maxrow 100 #define OK 1 #define ERROR -1 typedef struct{ int row; //行数 int col; //列数 int v; //非零元素值 }triplenode; typedef struct{ triplenode data[maxsize+1]; //非零元三元组 int rowtab[maxrow+1]; //各行第一个非零元的位置表 int mu,nu,tu; //矩阵的行数、列数和非零元个数}rtripletable; void creat(rtripletable &A) //创建稀疏矩阵 { int k=1,sum=1,loop,p,t; int num[maxrow+1]; cout<<"请输入矩阵的行数和列数:"<>A.mu; cout<<"列数:";cin>>A.nu; cout<<"非零元素个数:";cin>>A.tu; cout<<"请按行,列和值的形式输入该矩阵的非零元.并以全零为结束标记!"<>A.data[loop].row>>A.data[loop].col>>A.d ata[loop].v; //输入三元组的行数,列数和非零元素值 } for(p=1;p<=A.mu;p++) num[p]=0; //A三元组每一列的非零元素个数 for(t=1;t<=A.tu;t++) ++num[A.data[t].row]; //求A中每一列含非零元个数 A.rowtab[1]=1; //求第p列中第一个非零元在A.data中的序号for(t=2;t<=A.mu;t++) A.rowtab[t]=A.rowtab[t-1]+num[t-1]; return; } void print(rtripletable A) //输出稀疏矩阵 { int result[maxrow+1][maxrow+1]; //定义一个二维数组 int loop1,loop2; for(loop1=1;loop1<=A.mu;loop1++) for(loop2=1;loop2<=A.nu;loop2++) result[loop1][loop2]=0; //初始化为0 for(loop1=1;loop1<=A.tu;loop1++) result[A.data[loop1].row][A.data[loop1].col]=A.dat a[loop1].v; for(loop1=1;loop1<=A.mu;loop1++) { cout<<"|"; for(loop2=1;loop2<=A.nu;loop2++) cout<

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

教学单位计算机科学与技术 学生学号012301714315 数据结构 课程设计报告书 题目稀疏矩阵运算器 学生姓名秦豹 专业名称软件工程 指导教师李志敏

实验目的:深入研究数组的存储表示和实现技术,熟悉广义表存储结构的特性。 需要分析:稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。要求以带“行逻辑链接信息”的三元组顺序表存储稀疏矩阵,实现两矩阵的相加、相减、相乘等运算。输入以三元组表示,输出以通常的阵列形式列出。 软件平台:Windows 2000,Visual C++6.0或WINTC 概要设计:ADT Array { 数据对象: D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1} 数据关系: R = { ROW, COL } ROW = {| 0≤i≤b1-2, 0≤j≤b2-1} COL = {| 0≤i≤b1-1, 0≤j≤b2-2} 基本操作: CreateSMatrix(&M); //操作结果:创建稀疏矩阵M. Print SMatrix(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*N. } ADT Array

矩阵运算实验报告

实验报告 --矩阵运算 一.实验目的。 1.通过实践加强对程序设计语言课程知识点的理解和掌握,培养对课程知识综合运用能力、实际分析问题能力及编程能力,养成良好的编程习惯。 2.通过实践进一步领会程序设计的特点和应用,提高运用C++ 语言以及面向对象知识解决实际问题的能力。 3.通过实践掌握用C++ 语言编写面向对象的实用程序的设计方法,对面向对象方法和思想增加感性的认识; 4.学会利用C++程序设计语言编写出一些短小、可靠的Windows实用程序,切实提高面向对象的程序设计能力。为后续的相关课程的学习打下基础。 二.实验要求。 1.学会建立模板类; 2.实现矩阵的“加”、“减”、“乘”、“数乘”、“转置”; 3.动态存分配并用随机数填充; 4.注意“加”、“减”、“乘”要进行条件的判断; 三.设计思路。

3.1算法基本流程 1)获取用户输入的矩阵1的行数和列数,动态生成一个一维数组 2)利用随机数生成数组成员,并利用两个循环输出数组,使其符合矩阵的格式 3)矩阵2同矩阵1的处理方法 4)通过两个矩阵的行数和列数比较来判断能否进行加减乘等运算,如不能,输出相关信息 5)如能够进行计算,则利用数组进行相应运算,并按照正确格式输出 6)通过改变一维数组中元素的顺序来实现转置并输出 3.2算法流程图

四.基本界面。

五.关键代码。 5.1关键类的声明 class CMatrixclass { public: CMatrixclass() { int m_Row = 0; //行 int m_Col = 0; //列 m_pElements = NULL; //一维数组

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

稀疏矩阵基本操作实验报告 一、实验内容 稀疏矩阵的压缩储存结构,以及稀疏矩阵的三元组表表示方法下的转置、相加、相 乘等算法 二、实验目的 1. 熟悉数组、矩阵的定义和基本操作 2. 熟悉稀疏矩阵的储存方式和基本运算 3. 理解稀疏矩阵的三元组表类型定义,掌握稀疏矩阵的输入、输出和转置算法 三、实验原理 1. 使用三元组储存矩阵中的非零元素(三元组分别储存非零元素的行下标,列下标和 元素值)。除了三元组表本身,储存一个稀疏矩阵还需要额外的三个变量,分别储 存矩阵的非零元个数,矩阵的行数和矩阵的列数。 2. 稀疏矩阵的创建算法: 第一步:根据矩阵创建一个二维数组,表示原始矩阵 第二步:取出二维数组中的元素(从第一个元素开始取),判断取出元素是否为非零元素,如果为非零元素,把该非零元素的数值以及行下标和列下表储存到三元数 组表里,否则取出下一个元素,重复该步骤。 第三步:重复第二步,知道二维数组中所有的元素已经取出。 3. 稀疏矩阵倒置算法:

第一步:判断进行倒置的矩阵是否为空矩阵,如果是,则直接返回错误信息。 第二步:计算要倒置的矩阵每列非零元素的数量,存入到num 数组(其中num[i] 代表矩阵中第i 列非零元素的个数)。以及倒置后矩阵每行首非零元的位置,存入cpot 数组中(其中cpot 表示倒置后矩阵每行非零元的位置,对应表示原矩阵每列中第 一个非零元的位置)。 第三步:确定倒置后矩阵的行数和列数。 第四步:取出表示要导致矩阵中三元组表元素{e, I, j} (第一次取出第一个,依次取出下一个元素),从第二步cpot 数组中确定该元素倒置后存放的位置(cpot[j] ),把该元素的行下标和列下标倒置以后放入新表的指定位置中。cpot[j] 变量加一。 第五步:重复第四步,直到三元组表中所有的元素都完成倒置。 第六步:把完成倒置运算的三元组表输出。 4. 稀疏矩阵加法算法: 第一步:检查相加两个矩阵的行数和列数是否相同,如果相同,则进入第二步,否 则输出错误信息。 第二步:定义变量i 和j,用于控制三元组表的遍历。 第三步:比较变量矩阵M 中第i 个元素和矩阵N 中第j 个元素,如果两个元素是同一行元素,如果不是则进入第四步,如果是,再继续比较两个元素是否为同一列元 素,如果是,把两个元素值相加,放到三元组表中;否则把列下表小的元素依次放 到三元组表中。进入第五步 第四步:如果矩阵M 中第i 个元素的行下标大于矩阵N 中第j 个元素的行下标,则把矩阵N 中第j 个元素所在行的所有非零元素添加到三元组表中;如果矩阵M 中第

稀疏矩阵实验报告

稀疏矩阵基本操作 班级:计算机科学与技术(2)班 小组成员: 日期:2012年4月17日 1.需求分析 【实验目的】熟悉抽象数据类型的表示和实现方法。抽象数据类型需借助固有数据类型来表示和实现,及利用高级程序设计语言中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作,具体实现细节则依赖于所用的语言的功能。通过本次实习还可以帮助读者复习高级语言的使用方法。掌握数组的特点及基本操作,如存储、输出、乘积、转置等,,以便在实际问题背景下灵活应用。【基本要求】 1.用C++/C完成算法设计和程序设计并上机调试通过。 2.撰写实验报告,提供实验结果和数据。 3.分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。 2.概要设计 栈的抽象数据类型 ADT Matrix { 数据对象:D={aij| i=1,2,…,m;j=1,2,…,n; ai∈ElemSet,m 、n分别称为矩阵的行数和列数}数据关系:R={Row,Col} Row={|1<=i<=m,1<=j<=n-1} Col={

相关文档