矩阵快速转置和乘法Word下载.docx

上传人:b****4 文档编号:6867613 上传时间:2023-05-07 格式:DOCX 页数:18 大小:84.39KB
下载 相关 举报
矩阵快速转置和乘法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

|1<

=i<

=m,1<

=j<

=n-1}

Col={<

ai,j,ai+1,j>

=m-1,1<

=n}

基本操作;

CreateSMatrix(&

M);

操作结果:

创建稀疏矩阵M;

PrintSMatrix(M);

初始条件:

稀疏矩阵M存在。

输出稀疏矩阵M;

TransposeSmatrix(M,N) 

;

输出稀疏矩阵N

MultSMatrix(M,N,&

Q);

稀疏矩阵M的行数等于N的列数。

求稀疏矩阵的和Q=M*N.

}ADTSparseMatrix

(2)数据结构:

row

col

value

三元组的结构

(3)程序模块:

1)主程序模块:

Intmain()

{

初始化;

While

(1)

接受命令;

处理命令;

}

}

2)创建稀疏矩阵模块;

3)对已创建好的稀疏矩阵进行快速矩阵转置;

4)求稀疏矩阵的乘积Q=M*N模块;

5)输出稀疏矩阵模块;

(4)各模块的调用关系及算法设计如下流程图所示

四、详细设计

(1)三元组数据结构算法

typedefstruct{

inti,j;

/*行下标,列下标*/

ElemTypee;

/*非零元值*/

}Triple;

typedefstruct{

Tripledata[MAXSIZE+1];

/*零元三元组表,data[0]未用*/

intrpos[MAXRC+1];

intmu,nu,tu;

/*阵的行数、列数和非零元个数*/

}TSMatrix;

(2)稀疏矩阵的创建算法

StatusCreateSMatrix(TSMatrix&

M)/*创建一个稀疏矩阵*/

printf("

请输入稀疏矩阵的行数,列数,非零元数(请小于20个,用空格隔开各数据):

"

);

scanf("

%d%d%d"

&

M.mu,&

M.nu,&

M.tu);

if(M.tu>

MAXSIZE||M.tu<

=0||M.tu>

M.mu*M.nu)

{printf("

-----出错啦,非零元个数超过最大值!

!

\n"

returnERROR;

while(p<

=M.tu)

请输入第%d个非零元素的行,列,元素值(用空格隔开):

p);

scanf("

a,&

b,&

c);

M.data[0].i=0;

M.data[0].j=0;

if(a<

=M.mu&

&

b<

=M.nu&

c!

=0)

{if(a>

M.data[p-1].i||(a==M.data[p-1].i&

b>

M.data[p-1].j))

{M.data[p].i=a;

M.data[p].j=b;

M.data[p].e=c;

p++;

elseprintf("

-----出错啦,请从行到列,从小到大输入!

elseprintf("

-----出错啦,所输入数据超出范围!

if(a==M.mu&

b==M.nu&

p<

=M.tu){printf("

-----出错啦,输入顺序有误,请认真核查,从头输入!

p=1;

-----输入成功!

returnOK;

(3)稀疏矩阵的输出算法

StatusPrintMatrix(TSMatrixM)/*输出一个矩阵*/

{inti,j,p=1;

if(M.tu==0){printf("

-----找不到此矩阵或为空矩阵!

);

---%d行%d列%d个非零元素---\n以阵列方式输出为:

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

for(i=1;

i<

=M.mu;

i++)

{for(j=1;

j<

M.nu;

j++)

{if(i==M.data[p].i&

j==M.data[p].j)

%d"

M.data[p].e);

0);

if(i==M.data[p].i&

%d\n"

}

(4)稀疏矩阵的转置算法

StatusTransposeSMatrix(TSMatrixM,TSMatrix&

T)/*求快速稀疏矩阵M的转置矩阵T*/

{if(M.tu==0){printf("

-----找不到所需矩阵!

T.mu=M.nu;

T.nu=M.mu;

T.tu=M.tu;

for(p=1;

=M.nu;

++p)num[p]=0;

for(q=1;

q<

=M.tu;

++q)++num[M.data[q].j];

cpot[1]=1;

for(p=2;

++p)cpot[p]=cpot[p-1]+num[p-1];

++q)

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

k=cpot[p];

T.data[k].i=M.data[q].j;

T.data[k].j=M.data[q].i;

T.data[k].e=M.data[q].e;

++cpot[p];

-----转置成功!

(5)两个稀疏矩阵的乘法算法

StatusMultSMatrix(TSMatrixM,TSMatrixN,TSMatrix&

Q)/*求稀疏矩阵的积Q=M*N*/

if(M.tu==0||N.tu==0){printf("

if(M.nu!

=N.mu){printf("

-----此矩阵不能被运算,请核查行列数!

p++)/*为M.rpos[]赋值*/

{if(M.data[p].i==k)

{M.rpos[k]=p;

k++;

elseif(M.data[p].i>

k)

{M.rpos[k]=p--;

for(;

k<

k++)M.rpos[k]=M.tu;

k=1;

=N.tu;

q++)/*为N.rpos[]赋值*/

{if(N.data[q].i==k)

{N.rpos[k]=q;

k++;

elseif(N.data[q].i>

{N.rpos[k]=p--;

=N.mu;

k++)N.rpos[k]=N.tu;

Q.mu=M.mu;

/*初始化Q*/

Q.nu=N.nu;

Q.tu=0;

for(arow=1;

arow<

++arow)

{for(ccol=1;

ccol<

=N.nu;

ccol++)

ctemp[ccol]=0;

if(arow<

M.mu)

tp=M.rpos[arow+1];

elsetp=M.tu+1;

for(p=M.rpos[arow];

tp;

++p)

{brow=M.data[p].j;

if(brow<

N.mu)

t=N.rpos[brow+1];

elset=N.tu+1;

for(q=N.rpos[brow];

t;

{ccol=N.data[q].j;

ctemp[ccol]+=M.data[p].e*N.data[q].e;

}

for(ccol=1;

=Q.nu;

++ccol)/*将数组的值压缩储存到Q*/

{if(ctemp[ccol]!

=0)

{Q.tu++;

if(Q.tu>

MAXSIZE){printf("

-----出错啦,非零元个数超出最大值!

Q.data[Q.tu].i=arow;

Q.data[Q.tu].j=ccol;

Q.data[Q.tu].e=ctemp[ccol];

printf("

-----运算成功!

returnOK;

(6)函数及其函数调用关系

4.程序编码

#include<

stdio.h>

stdlib.h>

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

/*稀疏矩阵的三元组顺序表类型TSMatrix的定义*/

#defineMAXSIZE20/*非零元个数最大值*/

#defineMAXRC10

typedefintStatus;

typedefintElemType;

{intp=1,a,b,c;

StatusMultSMatrix(TSMatrixM,TSMatrixN,TSMatrix&

{intarow,brow,p,q,ccol,ctemp[MAXRC+1],t,tp,k=1;

ctemp[ccol]+=M.data[p].e*N.data[q].e;

StatusFastTransposeSMatrix(TSMatrixM,TSMatrix&

{intp,q,k=1;

intcpot[MAXSIZE],num[MAXSIZE];

 

voidShow()

{printf("

*****************************************************************\n"

============>

>

0.退出程序\n"

1.创建矩阵A\n"

2.输出矩阵A\n"

3.输出矩阵B\n"

4.输出矩阵C\n"

5.转置矩阵A->

B\n"

6.矩阵相乘A*B=C\n"

voidmain()

intselect;

TSMatrixA,B,C;

A.tu=0;

B.tu=0;

C.tu=0;

Show();

while

(1)

请选择:

"

%d"

select);

if(select==0)break;

switch(select){

case1:

CreateSMatrix(A);

break;

case2:

PrintMatrix(A);

case3:

PrintMatrix(B);

case4:

PrintMatrix(C);

case5:

FastTransposeSMatrix(A,B);

case6:

MultSMatrix(A,B,C);

default:

输入错误,请认真核查!

5、测试与分析

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

当前位置:首页 > 高等教育 > 文学

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

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