矩阵乘法(数学学科内容)

矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑地集中到了一起,所以有时候可以简便地表示一些复杂的模型,如电力系统网络模型。矩阵乘法是最简单的数学问题,同时由于其计算量大而通常被用来对计算机的浮点运算速度进行测试,尤其是对于并行计算机,其并行效率的好坏可通过这个简单的问题反应出来,如果在这个问题上都不能取得很好的效果,对于其它问题就更不可能。此外,为了提高计算性能,对求解数值代数中的问题最终会归结到有矩阵乘法的计算。

矩阵乘法(数学学科内容)

定义

设A为的矩阵,B为的矩阵,那么称的矩阵C为矩阵A与B的乘积,记作,其中矩阵C中的第行第列元素可以表示为:

如下所示:

注意事项

1、当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。

2、矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。

3、乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。

基本性质

乘法结合律:(AB)C=A(BC)

乘法左分配律:(A+B)C=AC+BC

乘法右分配律:C(A+B)=CA+CB

对数乘的结合性k(AB)=(kA)B=A(kB).

转置(AB)T=BTAT

矩阵乘法在以下两种情况下满足交换律。

AA*=A*A,A和伴随矩阵相乘满足交换律。

AE=EA,A和单位矩阵或数量矩阵满足交换律。

其他的乘积形式

除了上述的矩阵乘法以外,还有其他一些特殊的“乘积”形式被定义在矩阵上,值得注意的是,当提及“矩阵相乘”或者“矩阵乘法”的时候,并不是指代这些特殊的乘积形式,而是定义中所描述的矩阵乘法。在描述这些特殊乘积时,使用这些运算的专用名称和符号来避免表述歧义。

哈达马积(Hadamardproduct)

矩阵与矩阵的Hadamard积记作。其元素定义为两个矩阵对应元素的乘积的m×n矩阵。例如,

克罗内克积(KroneckerProduct)

克罗内克积是两个任意大小的矩阵间的运算,符号记作。克罗内克积也被称为直积或张量积.以德国数学家利奥波德·克罗内克命名。计算过程如下例所示:

实现

C++代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

structMatrix:vector<vector<int>>//使用标准容器vector做基类,需#include语句

{

Matrix(intx=0,inty=0,intz=0)//初始化,默认为0行0列空矩阵

{

assign(x,vector<int>(y,z));

}

inth_size()const//常量说明不可省,否则编译无法通过

{

returnsize();

}

intl_size()const

{

returnempty()?0:front().size();//列数要考虑空矩阵的情况

}

Matrixpow(intk);//矩阵的k次幂,用快速幂实现,k为0时返回此矩阵的单位矩阵

};

Matrixoperator*(constMatrix&m,constMatrix&n)//常量引用避免拷贝

{

if(m.l_size()!=n.h_size())returnMatrix();//非法运算返回空矩阵

Matrixans(m.h_size(),n.l_size());

for(inti=0;i!=ans.h_size();++i)

for(intj=0;j!=ans.l_size();++j)

for(intk=0;k!=m.l_size();++k)

ans[i][j]+=m[i][k]*n[k][j];

returnans;

}

MatrixMatrix::pow(intk)

{

if(k==0)

{

Matrixans(h_size(),h_size());

for(inti=0;i!=ans.h_size();++i)

ans[i][i]=1;

returnans;

}

if(k==2)return(*this)*(*this);

if(k%2)returnpow(k-1)*(*this);

returnpow(k/2).pow(2);

}

实际应用

数据统计

某公司有四个工厂,分布在不同地区,同时三种产品,产量(单位;t),试用矩阵统计这些数据。

工厂//产品

P1

P2

P3

5

2

4

3

8

2

6

0

4

0

1

6

可用下述矩阵描述,其中四行分别表示甲乙丙丁四个工厂的生产情况,三列分布表示三种产品P1,P2,P3的产量。

再设矩阵,其中第一列表示三种产品的单件利润,第二列表示三种产品的单件体积。

矩阵C的第一列数据分别表示四个工厂的利润,第二列分别表示四个工厂产品需要的存储空间。

路径问题

给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数。

把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j。令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),实际上就等于从点i到点j恰好经过2条边的路径数(枚举k为中转点)。类似地,C*A的第i行第j列就表示从i到j经过3条边的路径数。同理,如果要求经过k步的路径数,我们只需要二分求出A^k即可。

原创文章,作者:来自网友投稿,如若转载,请注明出处:https://www.ladyww.cn/article/20230712157870.html