矩阵连乘

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

《算法设计与分析》实验报告

矩阵连乘问题:

给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2,3…,n-1。考察这n个矩阵的连乘A1,A2,…,An。

实验基本思想:由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。设计求解矩阵连乘问题的动态规划算法的第1步是刻画该问题的最优解的结构特征。为方便起见,将矩阵连乘积简记为A[i:j]。考察计算A[1:n]的最优计算次序。设这个计算次序矩阵在Ak和Ak+1之间将矩阵链断开,,则其相应的完全加括号方式为((A1…Ak)(Ak+1…An))。依此次序,先计算A[1:k]和A[k+1:n],然后将计算结果相乘得到A[1:n]。

一.实验环境

VC++6.0

二.实验内容

C语言代码如下:

#include

using namespace std;

constint L = 7;

intMatrixChain(intn,int **m,int **s,int *p);

void Traceback(inti,intj,int **s);//构造最优解

int main()

{

int p[L]={28,17,15,30,10,30,28}; //A1为28*17 A2为17*15 A3为15*30 A4为30*10 A5为10*30 A6为30*28

int **s = new int *[L];

int **m = new int *[L];

for(int i=0;i

{

s[i] = new int[L];

m[i] = new int[L];

}

cout<<"矩阵最少的计算次数为:"<

cout<<"最优连乘顺序为:(两矩阵相乘后标号为前一个矩阵)"<

return 0;

}

intMatrixChain(intn,int **m,int **s,int *p)

{

for(int i=1; i<=n; i++)

{

m[i][i] = 0;

}

for(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

{

int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j]; if(t

{

m[i][j] = t;

s[i][j] = k;

}

}

}

}

return m[1][L-1];

}

voidTraceback(inti,intj,int **s)

{

if(i==j) return;

Traceback(i,s[i][j],s);

Traceback(s[i][j]+1,j,s);

cout<<"相乘的矩阵为 A"<

cout<<" and A"<<(s[i][j]+1)<<","<

}

三.实验总结

通过本次实验,我大概了解了动态规划算法的几个基本步骤。完成实验后,我认为建立递归关系是动态规划里面很关键的一步,同时也是整个动态规划算法的精髓。运用递归的思想,就可以避免计算很多重复的计算。具体到这次的矩阵连乘问题,关键是解决断开点k的位置和最少数乘次数。

相关文档
最新文档