第三节、矩阵乘法

我们之前已经接触了一些矩阵乘法的规则,现在来系统地学习一下。

一、基本要求

并不是随便拿两个矩阵就可以作矩阵乘法,想要做矩阵乘法,必须满足以下要求:

第一个矩阵的列数等于第二个矩阵的行数。

即如果第一个矩阵是m×n的,那么第二个必须是n×p的,其中m、n、p为任意正整数(一个a行b列可以用a×b表示)

二、基本性质

  1. 满足结合律 A(BC)=(AB)C
  2. 满足交换律 A(B+C)=AB+AC 、 (A+B)C=AC+BC
  3. 满足对数乘的结合性 k(AB)=(kA)B=A(kB)  ,k为任意常数
  4. 一般不满足交换律AB≠BA

三、矩阵乘法运算

  以下叙述中,默认以AB=C表示,其中A为m×n矩阵,B为n×P矩阵,C为二矩的阵乘积(m×p矩阵)。

  另,默认用Aij表示A矩阵第i行第j列元素

 1.基本方法(按行与列点乘考虑)

  用A中的每一行与B中的每一列进行点乘,并将得到的结果写在C相应的位置(用的A中的哪行就写在C的哪行,用的B的哪列就写在C的由A确定的行的哪列)

  

  即(下图源自百度百科

  

 2.按列考虑

  前面说过,在一个矩阵右边乘上一个矩阵相当于对该矩阵作列变换,在矩阵右边乘一个列向量相当于对该矩阵的列进行线性组合。

  沿袭楼上传统,我们假设A=,B=,顺便写上已经求出来的C=

  其中A乘以B的第一列等于

  A乘以B的第二列等于

  我们的结果是A乘以B的第一列等于C的第一列,A乘以B的第二列等于C的第二列。

  即,我们可以把B考虑成摆放在一起的p个单独的列向量,作乘法时用A乘以每一个列向量,从而可以得到p个列,将他们摆放在一起就得到了整个矩阵相乘的结果。

  也就是 C中的列是A各列的线性组合,而B决定线性组合的方式

  用另一种说法:矩阵乘以矩阵就是矩阵乘以列向量的叠加,也就是B对A的列进行线性组合的叠加(也许用“叠加”不是很恰当,也许可以用“拼凑”?“组合”?“拼合”?能理解这个意思就好)

 3.按行考虑

  既然可以按列考虑,自然也可以按行考虑。

  前面也介绍过,在一个矩阵左边乘上一个矩阵相当于对该矩阵作行变换,在矩阵左边乘一个行向量相当于对该矩阵的行进行线性组合。

  接着沿袭楼上传统,我们假设A=,B=,还有他们的乘积C=

  A的第一行乘以B等于 1[1  4] + 2[2  5] + 3[3  6] = [ 14  32 ]

  A的第二行乘以B等于 4[1  4] + 5[2  5] + 6[3  6] = [ 32  77 ]

  即,我们可以把A考虑成摆放在一起的m个单独的行向量,作乘法时用A的每一行乘以B,从而可以得到m个行,将他们摆放在一起就得到了整个矩阵相乘的结果。

  所以,C中的行是B各行的线性组合,而组合的方式由A决定

  我想,如果你理解了列的关系,那么行的关系也可以很容易地理解。

  如果你对按行考虑和按列考虑的思想感到很茫然,或者根本没听说过这种思考方式,那一定是你没看或没仔细看前面的两节内容,请回头仔细阅读。

 4.按列乘以行考虑

  基本方法用行点乘列得到一个数,而用列与行考虑得到的则是一个矩阵(m×p)

  还以A=,B=,C=为例。

  用A的第一列乘上B的第一行,得到

  用A的第二列乘上B的第二行,得到

  用A的第二列乘上B的第二行,得到

  将三个矩阵相加,我们得到了矩阵C。

  也就是说,矩阵相乘的结果等于A矩阵的各列与B矩阵对应的行的乘积的和。

 5.特殊性质:分块相乘

  分块相乘的意思就是你可以将矩阵分成匹配的多块(匹配即满足矩阵乘法规则),然后将每一块看成一个数进行乘法,规则与正常矩阵乘法相同,只是运算的元素由数字变成了更小的矩阵。

  举个例子,A=,B=,其中,A与B中各元素都是矩阵。

  则C=

  (注:计算机在矩阵较大时使用分块乘法可提高效率)

时间: 2024-10-22 05:43:17

第三节、矩阵乘法的相关文章

矩阵乘法的Strassen算法详解

题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p. 值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了: 下面咱们来具体解决这个矩阵相乘的问题. 解法一.暴力解法 其实,通过前面的分析

51nod 1137 矩阵乘法

基本的矩阵乘法 中间for(int j=0;i<n;i++)  //这里写错了   应该是j<n 晚上果然  效率不行 等会早点儿睡 //矩阵乘法 就是 两个矩阵 第一个矩阵的列 等与 第二个矩阵的行相同 // 然后ans[i][j] += a[i][k] * b[k][j]; #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 150; int n; ll a[ma

矩阵乘法

矩阵加法就是相同位置的数字加一下,矩阵减法也类似 矩阵乘以一个常数,就是所有位置都乘以这个数 矩阵乘以矩阵 计算规则是,第一个矩阵第一行的每个数字(2和1),各自乘以第二个矩阵第一列对应位置的数字(1和1),然后将乘积相加( 2 x 1 + 1 x 1),得到结果矩阵左上角的那个值3 矩阵的本质就是线性方程式,两者是一一对应关系.如果从线性方程式的角度,理解矩阵乘法就毫无难度.下面是一组线性方程式 矩阵的最初目的,只是为线性方程组提供一个简写形式 下面是严格的证明.有三组未知数 x.y 和 t,

矩阵乘法&lt;简单总结&gt;

原理:矩阵相乘最重要的方法是一般矩阵乘积.它只有在第一个矩阵的 行数 和第二个矩阵的 列数 相同时才可进行.若A为m×n矩阵,B为n×p矩阵,则他们的乘积AB会是一个m×p矩阵. 若A=    a    b    c        d    e    f        g    h    i    B=    A    D        B    E        C    F    A*B=CC=    aA+bB+cC    aD+bE+cF        dA+eB+fC    dD+eE

POJ2778 DNA Sequence Trie+矩阵乘法

题意:给定N个有A C G T组成的字符串,求长度为L的仅由A C G T组成的字符串中有多少个是不含给定的N个字符串的题解: 首先我们把所有的模式串(给定的DNA序列)建Trie,假定我们有一个匹配串,并且在匹配过程到S[i]这个字符时匹配到了Trie上的某个节点t,那么有两种可能: 匹配失败:t->child[S[i]]为空,跳转到t->fail,因此t->fail一定不能是某个模式串的结尾: 匹配成功:跳转到t->child[S[i+1]],因此t->child[S[i

【CDQ】BZOJ 2738 矩阵乘法

题意:给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数 思路: 整体二分+二维树状数组 二分询问的答案mid,将数值小等mid的全部插入二维树状数组 然后查询每个矩阵内的元素个数,若数量>K-1则放左边,否则放右边 继续向下分治,左边二分l-mid,右边mid-r 代码: #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include

codevs矩阵乘法系列

T1:矩阵乘法板子题,练手. #include <map> #include <set> #include <cmath> #include <ctime> #include <queue> #include <stack> #include <cstdio> #include <string> #include <vector> #include <cstdlib> #include

基于OpenMP的矩阵乘法实现及效率提升分析

一.  矩阵乘法串行实现 例子选择两个1024*1024的矩阵相乘,根据矩阵乘法运算得到运算结果.其中,两个矩阵中的数为double类型,初值由随机数函数产生.代码如下: #include <iostream> #include <omp.h> // OpenMP编程需要包含的头文件 #include <time.h> #include <stdlib.h> using namespace std; #define MatrixOrder 1024 #def

C语言 &#183; 矩阵乘法 &#183; 算法训练

问题描述 给定一个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 21 23 4 样例输出 7 1015 22 代码如下: #include<s