2022年 11月 9日

python矩阵乘法运算

一、矩阵乘法

矩阵乘法为 A@Bnp.dot(A,B) ,若为对应元素相乘则用 A*Bnp.multiply(A,B)

1. A@B 和 np.dot(A,B)

A = np.array([
    [1,2],
    [3,4]
])

B = np.array([
    [1,2],
    [3,4]
])

C1 = A @ B
C2 = np.dot(A,B)
print(C1)
print('---------')
print(C2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

输出为

[[ 7 10]
 [15 22]]
---------
[[ 7 10]
 [15 22]]
  • 1
  • 2
  • 3
  • 4
  • 5

2. A*B 或 np.multiply(A,B)

A = np.array([
    [1,2],
    [3,4]
])

B = np.array([
    [1,2],
    [3,4]
])

C3 = A*B
C4 = np.multiply(A,B)
print(C3)
print('---------')
print(C4)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

输出为

[[ 1  4]
 [ 9 16]]
---------
[[ 1  4]
 [ 9 16]]
  • 1
  • 2
  • 3
  • 4
  • 5

二、邻接矩阵的相乘的意义

1.定义

假设存在一个N个节点的无向图。我们用 G[u][v] = G[v][u] = 1 表示从点 u 到点 v 有连边,否则 G[u][v] = G[v][u] = 0

2.问题

如果用这个图的邻接矩阵进行自乘会得到什么呢?

3.理解

模拟矩阵的运算有

G

2

[

u

]

[

v

]

=

i

=

1

n

G

[

u

]

[

G^{2}[u][v] = {\textstyle \sum_{i=1}^{n}} G[u][

G2[u][v]=i=1nG[u][i

]

G

[

]* G[

]G[i

]

[

v

]

][v]

][v]。也就是说

G

2

[

u

]

[

v

]

G^{2}[u][v]

G2[u][v]图上点 u 到点 v 恰好经过两条边的路径的条数的矩阵。

具体的解释为
我们可以把原始邻接矩阵

G

[

u

]

[

v

]

G[u][v]

G[u][v] 看作为表示图上 u 到 v 恰好经过一条边的路径条数的矩阵。
那么

G

2

[

u

]

[

v

]

=

i

=

1

n

G

[

u

]

[

G^{2}[u][v] = {\textstyle \sum_{i=1}^{n}} G[u][

G2[u][v]=i=1nG[u][i

]

G

[

]* G[

]G[i

]

[

v

]

][v]

][v] 显然就是运用了乘法原理与加法原理。

类似的,

G

3

[

u

]

[

v

]

G^{3}[u][v]

G3[u][v] 表示什么意思呢?

G

3

G^{3}

G3 的计算过程

G

3

[

u

]

[

v

]

=

i

=

1

n

G

[

u

]

[

G^{3}[u][v] = {\textstyle \sum_{i=1}^{n}} G[u][

G3[u][v]=i=1nG[u][i

]

G

[

]* G[

]G[i

]

[

][

][j

]

G

[

]*G[

]G[j

]

[

v

]

][v]

][v] 。同理可知其表示为 图上点 u 到点 v 恰好经过三条边的路径的条数 的矩阵。或者我们也可以将其看作

G

3

=

G

2

G

G^{3}=G^{2}*G

G3=G2G,其本质是相同的。

由上述不难发现该性质对于一般的正整数 k 都是成立的。即

G

K

[

u

]

[

v

]

G^{K}[u][v]

GK[u][v] 表示图上 u 到 v 恰好经过k条边的路径条数的矩阵。也就是说如果需要在某个图上求 u 到 v 恰好经过 K 条边的路径的条数,我们完全可以使用矩阵快速幂来优化这个计算过程。

4.代码实现

邻接矩阵如下
在这里插入图片描述
代码如下

import torch
# 构建邻接矩阵
a = [
    [0,1,1,1],
    [1,0,0,1],
    [1,0,0,1],
    [1,1,1,0]
]

A = torch.tensor(a)
A = torch.mm(A,A)
print(A)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

输出结果如下

tensor([[3, 1, 1, 2],
        [1, 2, 2, 1],
        [1, 2, 2, 1],
        [2, 1, 1, 3]])
  • 1
  • 2
  • 3
  • 4