动态规划矩阵链乘法matlab,动态规划--矩阵链乘法

一、问题描述

矩阵乘法规则

如果A是a*b的矩阵,B是b*c的矩阵,那么AB就是a*c的矩阵,所做的乘法次数为a*b*c

矩阵链乘法

给定一个矩阵链A1A2A3A4,要计算乘积,给这个矩阵链加上括号,改变运算次序。

如果矩阵链为(A1,A2,A3,A4),那么有如下5中加括号的方式:

(A1(A2(A3A4)))

(A1((A2A3)A4))

((A1A2)(A3A4))

((A1(A2A3))A4)

(((A1A2)A3)A4)

改变矩阵的运算次序,能改变所做乘法的运算次数,比如说3个矩阵的链(A1,A2,A3),假设3个矩阵的维数分别为10*100,100*5,5*50。按照((A1,A2)A3)的次序来计算,需要10*100*5+10*5*50=7500次乘法。但如果按照(A1(A2,A3))的次序来计算,则需要100*5*50+10*100*50=75000次乘法,慢了10倍。

矩阵链乘法问题

矩阵链乘法问题就是寻找一个最佳的运算次序,使所做的乘法次数最小

p[n+1]:表示n个矩阵的维度,其中矩阵Ai的维度为pi-1*pi

二、问题分析

由前面可知,一个序列如果只有一个矩阵,则只有一种方式加全部括号,如果有两个或两个以上的矩阵,则必然可以看做两个子序列的乘积,且这两个子序列也是加全部括号。我们用cost(i,j)表示序列Ai…Aj在最优加全部括号时的标量乘积次数,则

32b0285e6d4b653c8f6d25a393840f3f.png

其中pi-1pkpj为子序列Ai…Ak与Ak+1…Aj相乘时的标量相乘次数。

三、代码实现

代码中,测试用例为6个矩阵相乘,各个矩阵的维度存放在p中

int main()

{

//代表矩阵链

int p[7] = {30,35,15,5,10,20,25};

//mij表示矩阵i到矩阵j的最小代价

int m[7][7] = {0};

//sij表示矩阵i到矩阵j最小代价的分割点

int s[7][7];

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

m[i][i] = 0;

//对于每一个不为1的长度

for (int j = 2; j <= 6; j++)

//k的取值不能大于6-k+1,这是计算位置的方式,要记得,

for (int k = 1; k <= 6 - j + 1; k++) {

int end = k + j - 1;

m[k][end] = 999999;

for (int n = k; n <= end; n++) {

int temp = m[k][n] + m[n + 1][end] + p[k-1] * p[n] * p[end];

if (temp < m[k][end]) {

m[k][end] = temp;

s[k][end] = n;

}

}

}

cout << m[1][6] << endl;

system("pause");

return 0;

}

最终输出结果为15125,表示最优运算次数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:给定一个矩阵的序列A1, A2, ..., An,其中Ai是一个P(i-1)×Pi阶的矩阵,我们需要确定一种乘法次序,使得基本运算的总次数达到最小。\[1\] 引用\[2\]:解决这个问题的一种方法是使用动态规划。我们可以使用一个二维数组m\[i\]\[j\]来记录序列Ai...Aj在最优加全部括号时的标量乘积次数。通过逐步添加矩阵的长度,我们可以计算出最优的乘法次序。具体的算法可以参考引用\[2\]中的代码。\[2\] 引用\[3\]:在Matlab中,可以使用类似的动态规划算法来解决矩阵乘法问题。可以使用一个二维数组来记录最优的乘法次序,并通过逐步添加矩阵的长度来计算最优解。具体的实现可以参考引用\[2\]中的代码,并根据Matlab的语法进行相应的修改。\[3\] 所以,要解决Matlab矩阵乘法问题,可以使用动态规划算法,并参考引用\[2\]中的代码进行实现。 #### 引用[.reference_title] - *1* [矩阵乘法动态规划)](https://blog.csdn.net/ysmok/article/details/116349355)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [矩阵相乘的乘法次数](https://blog.csdn.net/weixin_51571728/article/details/124222584)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值