python矩阵乘法运算
假设存在一个N个节点的无向图。我们用表示从点u到点v有连边,否则。
一、矩阵乘法
矩阵乘法为 A@B 或 np.dot(A,B) ,若为对应元素相乘则用 A*B 或 np.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)
输出为
[[ 7 10]
[15 22]]
---------
[[ 7 10]
[15 22]]
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 4]
[ 9 16]]
---------
[[ 1 4]
[ 9 16]]
二、邻接矩阵的相乘的意义
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=G2∗G,其本质是相同的。
由上述不难发现该性质对于一般的正整数 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)
输出结果如下
tensor([[3, 1, 1, 2],
[1, 2, 2, 1],
[1, 2, 2, 1],
[2, 1, 1, 3]])
更多推荐
所有评论(0)