• 问题描述

矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数和第二个矩阵的行数相同时才有意义。给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。比如A1(10*100),A2(100*5),A3(5*50)三个矩阵,相乘次序分别为((A1*A2)A3)和(A1(A2*A3))时,矩阵相乘的次数分别为7500(10*100*5+10*5*50)和75000(100*5*50+100*50*10),所以我们需要找到相乘次数最少的矩阵相乘次数(最优值)和矩阵相乘次序(最优解)。

  • 基本思路

递归公式

m[i][j]=m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j]

这里的i是第一个相乘矩阵的序列数,j是最后一个所乘的矩阵序列数,其中k是最后一次相乘时序列数i到j中间的任意一个断点数。

m[i][j]存放的是从第i个矩阵到第j个矩阵的矩阵连乘的计算次数

实例:

例:现在有六个矩阵相乘,分别是A1、A2、A3、A4、A5、A6,矩阵的行数和列数分别是A1(30,35)、A2(35,15)、A3(15,5)、A4(5,10)、A5(10,20)、A6(20,25),则六个矩阵相乘经过计算解得最优值为:15125,且最优解为:(A1*(A2*A3))*((A4*A5)*A6)

笔算过程如下:

过程是分层运算的,只有1个矩阵时、有2个矩阵时、有三个矩阵时、、、

全部代码如下:

#include<iostream>
using namespace std;int p[100];
int m[100][100], s[100][100];
int n;
//寻找最优值和断点位置
void matrixchain()
{int i, r, j, k;//初始化数组for (i = 0; i < 100; i++){for (j = 0; j < 100; j++){m[i][j] = 0;s[i][j] = 0;}}for (r = 2; r <= n; r++)//矩阵连乘的规模为r,此时计算的矩阵连乘的个数是r个且是顺序连续并所有的。从2开始,因为只有一个矩阵相乘的次数为0。{for (i = 1; i <= n - r + 1; i++)//第一个矩阵的下标范围{j = i + r - 1;//最后一个矩阵的下标范围m[i][j] = m[i + 1][j] + p[i - 1] * p[i] * p[j];//因为m[i][i]为0,先对m[i][j]赋一个在该位置(第一个断点位置)相连乘的值s[i][j] = i;//s[][]存储各子问题的决策点,前面m里面存的是在第一个断点位置的值,所以这里存1for (k = i + 1; k < j; k++)//寻找在最优位置断点的最优值{int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];if (t < m[i][j]){m[i][j] = t;//将最优值赋给ms[i][j] = k;//记录断点位置}}}}
}
//寻找最优解
void print(int i, int j)
{if (i == j){cout << "A[" << i << "]";return;}cout << "(";print(i, s[i][j]);cout << "*";print(s[i][j] + 1, j);cout << ")";
}int main()
{cout << "请输入矩阵的个数n : " << endl;cin >> n;int i, j;cout << "请依次输入每个矩阵的行数和最后一个矩阵的列数:" << endl;for (i = 0; i <= n; i++)cin >> p[i];//将第一个矩阵的列和第二个矩阵的行的下标置为相同的了matrixchain();cout << "最优值为:" << m[1][n] << endl;cout << "最优解计算方法为:";print(1, n);cout << endl;return 0;
}

结果如图:

动态规划矩阵连乘求最优值和最优解相关推荐

  1. 算法设计与分析——动态规划——矩阵连乘问题

    动态规划与分治法的异同: 相同点:其基本思想都是将待求解问题分解为若干子问题,先求解子问题,再结合这些子问题的解得到原问题的解. 差异点:与分治法不同的是,适合用动态规划法求解的问题经分解得到的子问题 ...

  2. 3D数学之矩阵的各种求逆

    经过三天的准备终于把矩阵的各种求逆方法以及代码完成了.心里有点小激动,come on,来吧,点燃你的心中的那团火,跟着游戏音乐的律动一起跟我走入神秘的3D世界. 下面介绍三种方法: 1.用伴随矩阵求逆 ...

  3. 第3章 动态规划 矩阵连乘问题

     两个矩阵相乘的计算量 程序实现 [cpp] view plaincopyprint? //矩阵a和b相乘,p.q分别为a的行和列,q.r分别为b的行和列 void MatrixMultiply( ...

  4. hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)

    http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序.问funny函数调用了多少次. 我们定义数组为所求 ...

  5. 矩阵快速幂求斐波那契数列(初学整理)

    参考文章: http://blog.csdn.net/u013795055/article/details/38599321 http://blog.csdn.net/g_congratulation ...

  6. 机器之心最干的文章:机器学习中的矩阵、向量求导

    作者:七月 本文的目标读者是想快速掌握矩阵.向量求导法则的学习者,主要面向矩阵.向量求导在机器学习中的应用.因此,本教程而非一份严格的数学教材,而是希望帮助读者尽快熟悉相关的求导方法并在实践中应用.另 ...

  7. 【SIMULINK】simulink实现信号矩阵整合、求逆、转置、分解、向量矩阵相乘(非matlab)

    [SIMULINK]simulink实现信号矩阵整合.求逆.转置.分解.乘(非matlab) simulink实现信号矩阵,并实现分解 simulink实现信号矩阵求逆 simulink实现信号矩阵转 ...

  8. QT/C++/Eigen 自己实现的MATLAB中的std()函数,矩阵按照列求标准差

    QT / C++ / Eigen 自己实现的MATLAB中的std()函数,矩阵按照列求标准差 //定义一个按列求标准差的函数,其中A为被求列标准差的矩阵,OutputMatrix为求出的列标准差 v ...

  9. C++设计矩阵,实现矩阵相乘和求逆矩阵

    矩阵变换是机器人学的基础,所以Jungle把这一节内容划分到"工业机器人"栏目.这一节Jungle用C++设计了矩阵的类Matrix,并设计了3个方法: 矩阵相加add 矩阵相乘m ...

最新文章

  1. NanoPlot:三代纳米孔测序数据质量评估
  2. 书单 | 春日必读书,少看一本都是遗憾
  3. Hadoop之Shuffle机制详解
  4. typecho免申请开发者应用集成第三方登录插件v2.1.2
  5. ToString yyyy-MM-dd ,MM 小写的故事。
  6. 如何创建ChromeApp
  7. Linux服务器文件权限被改
  8. 数学建模——stata基础操作
  9. 计算机win7关机重启,电脑win7关机后自动重启如何解决_win7一关机就立马自动重启修复方法-win7之家...
  10. shader三种变量类型(uniform,attribute和varying)
  11. 在android手机上运行PHP 1
  12. 数字图像处理-DFTDCTWHT小波变换分解重构(Matlab)
  13. 霍兰德人格分析雷达图的两个坑
  14. .考试倒计时43天!来提分啦!
  15. 高中数学必修2试题:直线平面平行的判定及其性质
  16. Linux 查看服务器几核几G
  17. Spring全家桶-Spring Security之自定义数据库表认证和鉴权
  18. CentOS 下搭建 Hadoop:Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).解决
  19. 揭秘软件开发中的达摩克利斯之剑
  20. Android游戏: 中国象棋-局域网版

热门文章

  1. 单位dbm db的关系与区别
  2. 网吧网管必备电脑常识教程篇之一
  3. 5G NR PDSCH的相位跟踪参考信号PTRS
  4. 中国移动呼叫转移设置
  5. 正规的棋牌游戏开发公司需要具备哪些条件
  6. 通过反编译分析骑砍2俘虏招募机制
  7. 双人矩阵博弈中的纳什均衡
  8. wpa_supplicant的用法
  9. linux 启动 参数,Linux启动参数
  10. mysql 表结构的复制