当前位置:文档之家› 矩阵转置与相加实验报告

矩阵转置与相加实验报告

矩阵转置与相加实验报告
矩阵转置与相加实验报告

一、实验容和要求

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; //非零元素个数

算法分析_实验报告3

兰州交通大学 《算法设计与分析》 实验报告3 题目03-动态规划 专业计算机科学与技术 班级计算机科学与技术2016-02班学号201610333 姓名石博洋

第3章动态规划 1. 实验题目与环境 1.1实验题目及要求 (1) 用代码实现矩阵连乘问题。 给定n个矩阵{A1,A2,…,A n},其中A i与A i+1是可乘的,i=1,2,…,n-1。考察这n 个矩阵的连乘积A1A2…A n。由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序,这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,则可以依此次序反复调用2个矩阵相乘的标准算法(有改进的方法,这里不考虑)计算出矩阵连乘积。 确定一个计算顺序,使得需要的乘的次数最少。 (2) 用代码实现最长公共子序列问题。 一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X= < x1, x2,…, xm>,则另一序列Z= < z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列< i1, i2,…, ik>,使得对于所有j=1,2,…,k有Xij=Zj 。例如,序列Z=是序列X=的子序列,相应的递增下标序列为<2,3,5,7>。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。例如,若X= < A, B, C, B, D, A, B>和Y= < B, D, C, A, B, A>,则序列是X和Y的一个公共子序列,序列也是X和Y的一个公共子序列。而且,后者是X和Y的一个最长公共子序列,因为X和Y没有长度大于4的公共子序列。 (3) 0-1背包问题。 现有n种物品,对1<=i<=n,已知第i种物品的重量为正整数W i,价值为正整数V i,背包能承受的最大载重量为正整数W,现要求找出这n种物品的一个子集,使得子集中物品的总重量不超过W且总价值尽量大。(注意:这里对每种物品或者全取或者一点都不取,不允许只取一部分) 使用动态规划使得装入背包的物品价值之和最大。 1.2实验环境: CPU:Intel(R) Core(TM) i3-2120 3.3GHZ 内存:12GB 操作系统:Windows 7.1 X64 编译环境:Mircosoft Visual C++ 6 2. 问题分析 (1) 分析。

矩阵分析实验报告

矩 阵 分 析 实 验 报 告 学院:电气学院 专业:控制工程 姓名: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 。而且它们是

算法分析与设计实验报告

算法设计与分析实验报告 班级:计科0902班 姓名:张华敏 学号:0909090814

矩阵连乘问题 一,实验内容: 二,写一个完整的代码来完整的实现矩阵连乘问题。 三,算法设计: 在矩阵连乘问题中,根据老师所讲和自己看书对动态规划方法的理解,通过最优子结构性质。再结合书上的算法,便可顺利的写出了代码 四,遇到的问题及解决方案: 只根据算法写出具体的实现过程刚开始觉得很难,觉得无从下手,不知道该用什么结构形式来存放各个参数,也不知道该怎样具体的实施算法的细节,但是课本上给出了一段实现代码给了我很大的启发,通过借鉴树上的代码实现再结合自己的努力,才终于完成了矩阵连乘全部的代码实现,包括最少连乘次数以及剖分方法。 五,源代码 package suanfa; public class Juzhen { public void matrixchain(int p[],int m[][],int s[][]){ i nt n=p.length-1; f or(int i=1;i<=n;i++){ m[i][i]=0; } f or(int r=2;r<=n;r++){ for(int i=1;i<=n-r+1;i++){ int j=i+r-1;

m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]; s[i][j]=i; for(int k=i+1;k

矩阵特征值实验报告

一、课题名称 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)

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

北京科技大学计算机与通信工程学院 实验报告 实验名称: 学生姓名: 专业: 班级: 学号: 指导教师: 实验成绩:________________________________ 实验地点: 实验时间: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);

矩阵转置及相加实验报告

一、实验内容和要求 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)处存在非零元素,则返回该元素存储在矩阵中的序号

矩阵连乘问题算法分析与设计

矩阵连乘问题《算法分析与设计》

设计性实验报告 课程名称:《算法分析与设计》矩阵连乘问题实验题目:长:组员一:成 二:成员成员三:数学与计算机科学系别:系专业班级:指导教师:实验日期: 一、实验目的和要求

实验目的 熟悉动态规划算法设计思想和设计步骤,掌握基 本的程序设计方法,培养学生用计算机解决实际问题的能力。 实验要求 1、根据实验内容,认真编写源程序代码、上机调试程序,书写实验报告。 2、本实验项目考察学生对教材中核心知识的掌握程度和解决实际问题的能力。 3、实验项目可

以采用集中与分散实验相结合的方式进行,学生利用平时实验课时间和课外时间进行 实验,要求在学期末形成完整的项目程序设计报告。 二、实验内容提要 矩阵连乘问题给定n个矩阵{A,A,…,A}, 其中,Ai与Ai+1是可乘的,n21A,A,…,A。由于矩阵乘法满足结n-1。考查这n个矩阵的连乘积i=1,2,…,n12合律,故计算矩阵的连乘积可以有 许多不同的计算次序。这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反 复调用2个矩阵相乘的标准算法计算出矩阵连乘积。完全加括号的矩阵连乘积可 递归地定义为: (1)单个矩阵是完全加括号的; (2)矩阵连乘积A是完全加括号的,则A可表示为2个完全加括号的矩阵连乘积B和C的乘积并加括号,即A=(BC)。 三、实验步骤下面考虑矩阵连乘积的最优计算次序问题的动态规划方法。(1)分析最优解的结构(最优子结构性质)设计求解具体问题的动态规划算法的第一步是刻画该问 题的最优解结构特征。对于矩阵乘积的最优计算次序问题也不例外。首先,为方便起见,降- 1 - 矩阵乘积Ai Ai+1…Aj简记为A[i:j]。

矩阵键盘设计实验报告

南京林业大学 实验报告 基于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、电路图

矩阵连乘实验报告

华北电力大学科技学院 实验报告 实验名称矩阵连乘问题 课程名称计算机算法设计与分析 专业班级:软件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

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

教学单位计算机科学与技术 学生学号 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

数学实验矩阵的运算

数学实验报告 学院: 班级: 学号: 姓名: 完成日期:

实验四矩阵的运算 (一)投入产出分析 一.实验目的 1.理解投入产出分析中的基本概念和模型; 2.从数学和投入产出理论的角度,理解矩阵乘法、逆矩 阵等的含义。 二.问题描述 设国民经济由农业、制造业和服务业三个部门构成,已知某年它们之间的投入产出关系、部需求、初始投入等如表1-1所示 表1-1国民经济三产部门之间的投入产出表 根据表回答下列问题: (1)如果农业、制造业、服务业外部需求为50,150,100,问三个部门总产出分别为多少? (2)如果三个部门的外部需求分别增加一个单位,问

他们的总产出分别为多少? 三.实验过程 1.问题(1)的求解 (1)求直接消耗矩阵A 根据直接消耗的计算公式 a ij=x ij/x j 和各部门中间需求; x n a n 运行如下代码可得直接消耗系数表。 X=[15 20 30;30 10 45;20 60 0]; X_colsum=[100 200 150]; X_rep=repmat(X_colsum,3,1) A=X./ X_rep 运行结果为: A = 0.1500 0.1000 0.2000 0.3000 0.0500 0.3000 0.2000 0.3000 0 (2)求解 根据公式 X=(I-A)-1y 在运行如下代码

y=[50;150;100]; n=size(y,1); W=eye(n)-A; X=W\y 运行结果为 X = 139.2801 267.6056 208.1377 即三个部门的总产出分别为139.2801,267.6056, 208.1377亿元。 2.问题2求解 设外部需求由y增加至y+Δy,则产出x的增量为 Δx=(I-A)-1(y+Δy)- (I-A)-1y=(I-A)-1Δy 利用问题(1)求得的I-A矩阵,再运行如下的MATLAB 代码可得问题的结果: dx=inv(W) 运行结果: dx = 1.3459 0.2504 0.3443 0.5634 1.2676 0.4930 0.4382 0.4304 1.2167

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

课程设计 课程:数据结构 题目:稀疏矩阵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.矩阵连乘问题 内容描述:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 功能分析:输入包含多组测试数据。第一行为一个整数C,表示有C 组测试数据,接下来有2*C行数据,每组测试数据占2行,每组测试数据第一行是1个整数n,表示有n个矩阵连乘,接下来一行有n+1 个数,表示是n个矩阵的行及第n个矩阵的列,它们之间用空格隔开。输出应该有C行,即每组测试数据的输出占一行,它是计算出的矩阵最少连乘积次数。 例如:输入:1输出:7500 3 10 100 5 50 2.Pebble Merging 内容描述:在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。 编程任务: 对于给定n堆石子,编程计算合并成一堆的最小得分和最大得分。 功能分析:输入由多组测试数据组成。每组测试数据输入的第1 行是正整数n,1≤n≤100,表示有n堆石子。第二行有n个数,分别表示每堆石子的个数。 对应每组输入,输出的第1 行中的数是最小得分;第2 行中的数是最大得分。 例如:输入:4 输出:43 4 4 5 9 54

二、算法过程设计. 1.矩阵连乘问题 矩阵连乘问题是通过设置数组,利用数组的横竖坐标来进行矩阵对应行与列的计算。 2.Pebble Merging 这个问题也是跟数组相关,通过寻找数组中的最大和最小值来进行计算。 三、程序调试及结果(附截图). 1.矩阵连乘问题 2.Pebble Merging

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.通过实践加强对程序设计语言课程知识点的理解和掌握,培养对课程知识综合运用能力、实际分析问题能力及编程能力,养成良好的编程习惯。 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; //一维数组

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

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

————————————————————————————————作者:————————————————————————————————日期: 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

矩阵连乘备忘录算法

湖南涉外经济学院计算机科学与技术专业 《算法设计与分析》课程 矩阵连乘备忘录算法 实验报告 班级: 学号: 姓名: 教师: 成绩: 2012年5月 【实验目的】 1 掌握动态规划算法和备忘录方法; 2 利用动态规划备忘录思想实现矩阵连乘; 3 分析实验结果,总结算法的时间和空间复杂度。思考是否能将算法的时间复杂度提高到 O(nlgn) 【系统环境】 Windows 07 平台 【实验工具】 VC++6.0中文企业版 【问题描述】 描述:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1可乘的,i=1,2,…,n-1。找出这个n个矩阵的连乘A1A2…An所需相乘的最少次数的方式。 例:矩阵连乘积A1A2A3A4可以有一下五种不同的完全加括号方式: (A1(A2(A3A4)))

(A1((A2A3)A4)) ((A1A2)(A3A4)) ((A1(A2A3))A4) (((A1A2)A3)A4) 【实验原理】 原理:1、矩阵连乘满足结合律,且不同的结合方式,所需计算的次数不同。 2、利用备忘录方法,用表格保存以解决的子问题答案,降低重复计算,提高效率。 思路:m初始化为0,表示相应的子问题还位被计算。在调用LookupChain时,若m[i][j]>0,则表示其中储存的是所要求子问题的计算结果,直接返回此结果即刻。否则与直接递归算法一样,自顶而下的递归计算,并将计算结果存入m[i][j]后返回。因此,LookupChain总能返回正确的值,但仅在它第一次被调用时计算,以后调用就直接返回计算结果。 方法:用MemorizedMatrixChain函数将已经计算的数据存入表中,用LookupChain函数配合MemorizedMatrixChain函数递归调用计算。 【源程序代码】 #include #include #include #define N 10 int p[N],m[N][N],s[N][N]; int LookupChain(int i,int j); //备忘录算法函数 int MemorizedMatrixChain(int n,int **m,int **s) { for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) m[i][j]=0;

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

科技大学计算机与通信工程学院 实验报告 实验名称: 学生: 专业: 班级: 学号: 指导教师: 实验成绩:________________________________ 实验地点: 实验时间: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);

动态规划算法实验报告

动态规划算法实验报告

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

实验标题 1、矩阵连乘 2、最长公共子序列3、最大子段和 4、凸多边形最优三角剖分 5、流水作业调度 6、0-1背包问题 7、最优二叉搜索树 实验目的掌握动态规划法的基本思想和算法设计的基本步骤。 实验内容与源码1、矩阵连乘 #include #include using namespace std; const int size=4; //ra,ca和rb,cb分别表示矩阵A和B的行数和列数 void matriMultiply(int a[][4],int b[][4],int c[][4],int ra,intca,int rb,int cb) { if(ca!=rb) cerr<<"矩阵不可乘"; for(int i=0;i<ra;i++) for(int j=0;j<cb;j++) { int sum=a[i][0]*b[0][j]; for(int k=1;k

相关主题
文本预览
相关文档 最新文档