前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >矩阵乘法问题

矩阵乘法问题

作者头像
我没有三颗心脏
发布于 2018-04-26 08:06:13
发布于 2018-04-26 08:06:13
1.5K00
代码可运行
举报
文章被收录于专栏:Java WebJava Web
运行总次数:0
代码可运行

问题描述

给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。


矩阵乘法的顺序安排

对于图像处理来说,矩阵运行是中必不可少的重要数学方法,另外在神经网络、模式识别等领域也有着广泛的用途。在这里就先来简单复习一下矩阵的相关知识:


矩阵乘法

在矩阵乘法中,第一个矩阵的行数和第二个矩阵的列数必须是相同的。先来看一个简单的例子:

之所以这样要求,是因为矩阵的乘法定义中,就要求了,第一个矩阵每一行和第二个矩阵每一列相对应位置的数字做乘的操作:

如果A矩阵是p×q的矩阵,B是q×r的矩阵,那么乘积C是p×r的矩阵。它们一共计算了p×q×r次。

以下是一段计算两个矩阵乘积的标准算法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void matrixMultiply(int[][] matrixA, int[][] matrixB,int[][] matrixC,int ra, int ca, int rb, int cb) {
    if (ca != cb) {
        System.err.println("矩阵不可乘!");
        return;
    }   // end if

    for (int i = 0; i < ra; i++) {
        for (int j = 0; j < cb; j++) {
            int sum = matrixA[i][0] * matrixB[0][j];
            for (int k = 0; k < ca; k++) {
                sum += matrixA[i][k] * matrixB[k][j];
            }   // end for
            matrixC[i][j] = sum;
        }
    }
}

顺序安排

假设给定3个矩阵,A、B、C,它们的规模分别是10×100、100×5和5×50。

  • 如果按照((AB)C)的顺序计算: 为计算AB(规模10×5),需要做10×100×5=5000次标量乘法,再与C相乘又需要做10×5×50=2500次标量乘法, 共需要7500次标量乘法。
  • 如果按照(A(BC))的顺序计算: 为计算BC(规模100×50),需要做100×5×50=25000次标量乘法,再与A相乘又需要做10×100×50=50000次标量乘法,共需要75000次标量乘法。

因此,按第一种顺序计算矩阵连乘要比第二种顺序快10倍。所以,进行一些计算来确定最有顺序还是值得的。


动态规划法

设mLeft,Right是进行矩阵乘法ALeftALeft+1···ARight-1ARight所需要的乘法次数。为一致起见,mLeft,Left=0。设最后的乘法是(ALeft···Ai)(Ai+1ARight),其中 Left ≤ i ≤ Right。

此时所用的乘法次数为:mLeft,i + mi+1,Right + cLeft-1cicRight。这三项分别代表计算(ALeft···Ai)、(Ai+1ARight)以及它们的乘积所需要的乘法。除了最后的答案,还要显示实际的乘法顺序,所以我们还要记录i的值,由此得到以下算法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void optMatrix(int[] c, long[][] m, int[][] lastChange) {
    int n = c.length - 1;

    for (int left = 0; left < n; left++) {
        m[left][left] = 0;
    }
    for (int k = 1; k <= n; k++) {
        for (int left = 1; left <= n - k; left++) { // k is right - left,即子问题规模
            // For each postion
            int right = left + k;
            m[left][right] = INFINITY;              // 置为无穷大
            for (int i = left; i < right; i++) {    // i为断开位置
                long thisCost = m[left][i] + m[i + 1][right] +
                        c[left - 1] * c[i] * c[right];

                if (thisCost < m[left][right]) {    // Update min
                    m[left][right] = thisCost;
                    lastChange[left][right] = i;
                }
            }
        }   // end inner for
    }   // end outer for
}

这个程序包含三重嵌套循环,容易看出它以O(N3)时间运行。这里其实有更快地算法,但由于执行具体矩阵乘法的时间仍然很可能会比计算最有顺序的乘法的时间多得多,所以这个算法还是挺实用的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.11.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
动态规划(详解矩阵连乘 案例+Java代码实现)
@toc 动态规划 History does not occur again 算法总体思想 与分治算法类似 子问题往往不是互相独立的, (分治会重复计算) 保存已解决的子问题的答案,需要时找出即可(空间换时间) 基本步骤 找出最优解的性质并刻划其结构特征 递归地定义最优值 以自底向上的方式计算出最优值(递推) 根据计算最优值时得到的信息构造最优解 矩阵连乘问题 问题描述 给定n个矩阵{A<sub>1</sub>, A<sub>2</sub>,..., A<sub>n</sub>}, 其中A<sub>i</s
ruochen
2021/05/14
1.3K0
动态规划(详解矩阵连乘 案例+Java代码实现)
矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)
矩阵乘法的Strassen 这个算法就是在矩阵乘法中采用分治法,能够有效的提高算法的效率。 先来看看咱们在高等代数中学的普通矩阵的乘法 两个矩阵相乘 上边这种普通求解方法的复杂度为: O(n3)
张俊怡
2018/04/24
4.1K0
矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)
对于"矩阵连乘问题"的一点想法
在算法设计的学习中,每到“动态规划”一节,一般都会涉及到“矩阵连乘”问题(例如《Algorithms》,中文译名《算法概论》),可想而知该题的经典程度 :)
用户2615200
2018/08/02
9530
4.算法设计与分析__动态规划
一、动态规划的基本思想 动态规划算法通常用于求解具有某种最优性质的问题。 在这类问题中,可能会有许多可行解。 每一个解都对应于一个值,我们希望找到具有最优值的解。 基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。 如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。 我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。 这就是动态规划法的基本思路。 具体的动态规划算法多种多样,但它们具有相同的填表格式。 二、设计动态规划法的步骤 找出最优解的性质,并刻画其结构特征; 递归地定义最优值(写出动态规划方程); 以自底向上的方式计算出最优值; 根据计算最优值时得到的信息,构造一个最优解。 步骤1~3是动态规划算法的基本步骤。 在只需要求出最优值的情形,步骤4可以省略; 若需要求出问题的一个最优解,则必须执行步骤4。 三、动态规划问题的特征 动态规划算法的有效性依赖于问题本身所具有的两个重要性质: 最优子结构: 当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。 重叠子问题: 在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题的解。
Twcat_tree
2022/11/30
9140
4.算法设计与分析__动态规划
FZU 1061 矩阵连乘
 Problem 1061 矩阵连乘 Accept: 445    Submit: 1699 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description 给定n个矩阵{A1,A2,...,An},考察这n个矩阵的连乘积A1A2...An。由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序,这种计算次序可以用加括号的方式来确定。 矩阵连乘积的计算次序与其计算量有密切关系。例如,考察计算3个矩阵{A1,A2,A3
ShenduCC
2018/04/26
8290
python动态规划解决矩阵连乘
        动态规划算法与分治法类似,其基本思想也就是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解,简单概括为自顶向下分解,自底向上求解。         与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是相互独立的,换句话说,就是前面解决过的子问题,在后面的子问题中又碰到了前面解决过的子问题,子问题之间是有联系的。如果用分治法,有些同样的子问题会被重复计算几次,这样就很浪费时间了。所以动态规划是为了解决分治法的弊端而提出的,动态规划的基本思想就是,用一个表来记录所有已经解决过的子问题的答案,不管该子问题在以后是否会被用到,只要它被计算过,就将其结果填入表中,以后碰到同样的子问题,就可以从表中直接调用该子问题的答案,而不需要再计算一次。具体的动态规划的算法多种多样,但他们都具有相同的填表式。         动态规划的适用场合,一般适用于解最优化问题,例如矩阵连乘问题、最长公共子序列、背包问题等等。
Flaneur
2020/03/25
1.5K0
动态规划之矩阵连乘
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 例如:   A1={30x35} ; A2={35x15} ;A3={15x5} ;A4={5x10} ;A5={10x20} ;A6={20x25} ; 结果为:((A1(A2A3))((A4A5)A6))  最小的乘次为15125。 原问题为n个矩阵连乘,将原问题分解为子问题,即当n等于1,2,3.....时。 n==1时,单一矩阵
欠扁的小篮子
2018/04/11
1.2K0
动态规划之矩阵连乘
【算法分析】动态规划详解+范例+习题解答
递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质
司六米希
2022/11/15
9700
【算法分析】动态规划详解+范例+习题解答
算法分析与设计论文
递归算法是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。它通常把一个大型复杂的问题转化为一个与原问题类似的规模较小的问题来求解。
全栈程序员站长
2022/09/20
6010
算法分析与设计论文
【数据结构】数组和字符串(七):特殊矩阵的压缩存储:三元组表的转置、加法、乘法操作
  矩阵是以按行优先次序将所有矩阵元素存放在一个一维数组中。但是对于特殊矩阵,如对称矩阵、三角矩阵、对角矩阵和稀疏矩阵等, 如果用这种方式存储,会出现大量存储空间存放重复信息或零元素的情况,这样会造成很大的空间浪费。为节约存储空间和算法(程序)运行时间,通常会采用压缩存储的方法。
Qomolangma
2024/07/30
1720
【数据结构】数组和字符串(七):特殊矩阵的压缩存储:三元组表的转置、加法、乘法操作
矩阵与状态转移方程
均值现在是一个向量,每个维度对应一个元素,方差变为协方差。协方差定义的是高斯函数的分散
小飞侠xp
2018/11/08
1.1K0
分治法(Divide-and-Conquer Algorithm)经典例子分析
上一篇文章里给大家介绍了归并排序,今天首先给大家带来同样运用分治法来解决问题的快速排序。
用户1621951
2019/10/18
3.5K0
Strassen矩阵乘法问题(Java)
矩阵乘法是线性代数中最常见的问题之一 ,它在数值计算中有广泛的应用。 设A和B是2个nXn矩阵, 它们的乘积AB同样是一个nXn矩阵。 A和B的乘积矩阵C中元素C[i][j]定义为:
WHYBIGDATA
2023/01/31
7170
Strassen矩阵乘法问题(Java)
每日一题(1)
矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列(column)和第二个矩阵的行数(row)相同时才有意义 。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。
C语言与CPP编程
2020/12/02
4720
每日一题(1)
09:矩阵乘法
09:矩阵乘法 总时间限制: 1000ms 内存限制: 65536kB描述 计算两个矩阵的乘法。n*m阶的矩阵A乘以m*k阶的矩阵B得到的矩阵C 是n*k阶的,且C[i][j] = A[i][0]*B[0][j] + A[i][1]*B[1][j] + …… +A[i][m-1]*B[m-1][j](C[i][j]表示C矩阵中第i行第j列元素)。 输入第一行为n, m, k,表示A矩阵是n行m列,B矩阵是m行k列,n, m, k均小于100 然后先后输入A和B两个矩阵,A矩阵n行m列,B矩阵m行k列,
attack
2018/04/03
1.7K0
详解Python中的算术乘法、数组乘法与矩阵乘法
(2)列表、元组、字符串这几种类型的对象与整数之间的乘法,表示对列表、元组或字符串进行重复,返回新列表、元组、字符串。
Python小屋屋主
2021/05/11
9.6K0
详解Python中的算术乘法、数组乘法与矩阵乘法
试题 基础练习 矩阵乘法
资源限制 内存限制:512.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述   给定一个N阶矩阵A,输出A的M次幂(M是非负整数)   例如:   A =   1 2   3 4   A的2次幂   7 10   15 22 输入格式   第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数   接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值 输出格式   输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开 样例输入 2 2 1 2 3 4 样例输出 7 10 15 22 提交代码:
GeekLiHua
2025/01/21
980
日拱一卒,麻省理工的线性代数课,矩阵乘法和逆矩阵
这几天一直在成都办事,每天回来都倒头就睡,实在是没有时间,所以耽误了几天更新。之后会逐渐回到正轨~
TechFlow-承志
2022/09/21
6830
日拱一卒,麻省理工的线性代数课,矩阵乘法和逆矩阵
#100. 矩阵乘法
矩阵乘法 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 这是一道模板题。 分别给定 n×p n \times pn×p 和 p×m p \times mp×m 的两个矩阵 A AA 和 B BB,求 A×B A \times BA×B。 输入格式 第一行三个正整数 n nn、p pp、m mm,表示矩阵的长宽。 之后的 n nn 行,每行 p pp 个整数,表示矩阵 A AA。 之后的 p pp 行,每
attack
2018/04/11
1.9K0
#100. 矩阵乘法
基础练习 矩阵乘法
  给定一个N阶矩阵A,输出A的M次幂(M是非负整数)   例如:   A =   1 2   3 4   A的2次幂   7 10   15 22
刘开心_1266679
2019/02/14
8880
相关推荐
动态规划(详解矩阵连乘 案例+Java代码实现)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验