矩阵转置及相加实验报告Word文档格式.docx

上传人:b****1 文档编号:3243292 上传时间:2023-05-01 格式:DOCX 页数:18 大小:23.89KB
下载 相关 举报
矩阵转置及相加实验报告Word文档格式.docx_第1页
第1页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第2页
第2页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第3页
第3页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第4页
第4页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第5页
第5页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第6页
第6页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第7页
第7页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第8页
第8页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第9页
第9页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第10页
第10页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第11页
第11页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第12页
第12页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第13页
第13页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第14页
第14页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第15页
第15页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第16页
第16页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第17页
第17页 / 共18页
矩阵转置及相加实验报告Word文档格式.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

矩阵转置及相加实验报告Word文档格式.docx

《矩阵转置及相加实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《矩阵转置及相加实验报告Word文档格式.docx(18页珍藏版)》请在冰点文库上搜索。

矩阵转置及相加实验报告Word文档格式.docx

CreateTSMatrix(&

M)

操作结果:

创建矩阵M

PrintTSMatrix(M)

初始条件:

矩阵M已存在

输出矩阵M中三元组形式的非零元素

PrintTSMatrix1(M)

以阵列形式输出矩阵

UnZore(M,row,col)

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

TSMatrix_Add(M,N,&

Q)

矩阵M,N已存在

将矩阵M,N相加得到Q并返回矩阵Q

FastTransposeSMatrix(M,&

N)

将矩阵M快速转置得到转置矩阵N并返回

}ADTTSMatrix;

⒊本程序模块结构

⑴主函数模块

voidmain(){

初始化迷矩阵;

创建矩阵并输出;

将矩阵转置并输出;

将矩阵相加并输出结果;

三、详细设计

1、基本数据类型操作

⑴typedefintElemType;

typedefstruct{

inti,j;

ElemTypee;

}Triple;

//数据类型三元组

Tripledata[maxsize+1];

//矩阵大小

intmu,nu,tu;

//

}TSMatrix;

//矩阵抽象数据类型

2、参数设置:

#definemaxsize10000

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

StatusCreateTSMatrix(TSMatrix*M){

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

srand((int)time(NULL));

printf("

PleaseInputTheLinesAndColumnsOfTheMatrix:

\n"

);

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

scanf(M->

mu,M->

nu);

for(m=0;

m<

M->

mu;

m++){

for(n=0;

n<

nu;

n++){

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

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

if(rand()%2)

M->

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

else

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

M->

data[p].i=m+1;

data[p].j=n+1;

p++;

}

}

M->

tu=p-1;

//p从1开始,非零元个数刚好等于p-1

returnOK;

}

voidPrintTSMatrix(TSMatrixM){

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

if(M.tu==0)

printf("

无非零元!

else{

该矩阵的行数为%d、列数为%d、非零元素个数为%d.\n非零元的坐标及值:

\n\n"

M.mu,M.nu,M.tu);

行列元素值\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);

}

voidPrintTSMatrix1(TSMatrixM){

//输出矩阵的阵列形式

阵列形式为:

for(i=1;

=M.mu;

for(j=1;

j<

=M.nu;

j++)

if(k<

M.tu&

&

p->

i==i&

j==j){

%4d"

p->

e);

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

p++;

k++;

else

0);

intUnZore(TSMatrixM,introw,intcol){

while(order<

=M.tu){

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

M.data[order].j==col)//order从1开始

returnorder;

order++;

return0;

StatusTSMatrix_Add(TSMatrixM,TSMatrixN,TSMatrix*Q){

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

if(M.mu==N.mu&

M.nu==N.nu){

for(row=1;

row<

row++){

for(col=1;

col<

col++){

order1=UnZore(M,row,col);

order2=UnZore(N,row,col);

if(order1&

order2){

Q->

data[order].i=row;

data[order].j=col;

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

order++;

}

elseif(order1&

(!

order2)){

data[order].e=M.data[order1].e;

data[order].i=M.data[order1].i;

data[order].j=M.data[order1].j;

elseif((!

order1)&

data[order].e=N.data[order2].e;

data[order].i=N.data[order2].i;

data[order].j=N.data[order2].j;

Q->

mu=M.mu;

nu=M.nu;

tu=order-1;

returnOK;

\n不是同型矩阵不能进行相加!

returnERROR;

StatusFastTransposeSMatrix(TSMatrixM,TSMatrix*N){

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

N->

mu=M.nu;

nu=M.mu;

tu=M.tu;

if(N->

tu){

++i)

num[i]=0;

for(t=1;

t<

++t)

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

//求M中每一列非零元个数

cpot[1]=1;

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

for(i=2;

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

for(p=1;

p<

++p){

i=M.data[p].j;

q=cpot[i];

data[q].i=M.data[p].j;

data[q].j=M.data[p].i;

data[q].e=M.data[p].e;

++cpot[i];

}

⑶主函数算法:

TSMatrixA,A1,B,C;

矩阵A:

CreateTSMatrix(&

A);

PrintTSMatrix(A);

PrintTSMatrix1(A);

由矩阵A转置得矩阵A1...\n"

FastTransposeSMatrix(A,&

A1);

PrintTSMatrix(A1);

PrintTSMatrix1(A1);

矩阵B:

B);

PrintTSMatrix(B);

PrintTSMatrix1(B);

矩阵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、本程序的运行环境为windows7(64位)操作系统,执行文件为矩阵.exe;

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

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

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

如图所示:

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

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

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

#include<

stdio.h>

#include<

stdlib.h>

#include"

time.h"

#defineOK1

#defineERROR0

#defineTRUE1

#defineFALSE0

#defineOVERFLOW-1

typedefintElemType;

typedefintStatus;

typedefstruct{

inti,j;

ElemTypee;

}Triple;

intmu,nu,tu;

}TSMatrix;

StatusCreateTSMatrix(TSMatrix*M);

//创建矩阵

voidPrintTSMatrix(TSMatrixM);

//输出矩阵非零元素

voidPrintTSMatrix1(TSMatrixM);

//以阵列形式输出矩阵

intUnZore(TSMatrixM,introw,intcol);

//判断位置(row,col)是否存在非零元素

StatusTSMatrix_Add(TSMatrixM,TSMatrixN,TSMatrix*Q);

//将矩阵M,N相加得到Q

StatusFastTransposeSMatrix(TSMatrixM,TSMatrix*N);

//快速转置

voidmain()

{

intm,n,p=1,num;

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

num为非零元个数最大值

intk[100][100];

srand((int)time(NULL));

TheLineNumber:

"

scanf("

%d"

&

mu);

TheColumnNumber:

/*

for(m=1;

=M->

m++)

for(n=1;

n++)

k[m][n]=0;

num=(m*n)/20;

num);

=num;

p++){

m=rand()%M->

mu+1;

n=rand()%M->

nu+1;

if(rand()%2==1)

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

elseif(rand()%2==0)

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

if(k[m][n]!

=0){

data[p].e=k[m][n];

data[p].i=m;

data[p].j=n;

*/

//p从1开始,刚好等于非零元个数-1

inti;

inti,j,k=0;

Triple*p=M.data;

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

intorder=1;

//data[0]未用

M.data[order].j==col)

introw,col;

intorder=1,order1,order2;

inti,t,p,q,num[100],cpot[100];

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2