Python 3.x 理解cuthill-mckee聚类

Python 3.x 理解cuthill-mckee聚类,python-3.x,algorithm,networkx,linear-algebra,adjacency-matrix,Python 3.x,Algorithm,Networkx,Linear Algebra,Adjacency Matrix,我试图通过Cuthill McKee减少图的邻接矩阵中的条目的带宽 算法 我有下面的输入图,我可以得到排列顺序 import networkx as nx import matplotlib.pyplot as plt from networkx.utils import reverse_cuthill_mckee_ordering, cuthill_mckee_ordering G = nx.gnm_random_graph(n=30, m=55, seed=1) nxpos = nx.sp

我试图通过Cuthill McKee减少图的邻接矩阵中的条目的带宽 算法

我有下面的输入图,我可以得到排列顺序

import networkx as nx
import matplotlib.pyplot as plt
from networkx.utils import reverse_cuthill_mckee_ordering, cuthill_mckee_ordering

G = nx.gnm_random_graph(n=30, m=55, seed=1)
nxpos = nx.spring_layout(G, dim=2, iterations=10000)
nx.set_node_attributes(G, nxpos, 'pos')
rcm = list(cuthill_mckee_ordering(G))
        
接下来,我重新标记了原始图的节点

d = OrderedDict(zip(G.nodes(), rcm))
H = nx.relabel_nodes(G, mapping=d)
H_adj = nx.adjacency_matrix(H, nodelist=range(len(H.nodes())))
plt.spy(H_adj)
plt.show()
不幸的是,邻接矩阵
H_adj
不是带状的

另一方面,当我尝试下面的
G_adj_rcm
时,它是带状的

 G_adj_rcm = nx.adjacency_matrix(G, nodelist=rcm)
 plt.spy(G_adj_rcm)
 plt.show()


我不确定重新标记是否不正确,或者我是否无法理解算法是如何工作的。澄清一下为什么不加标签会有很大帮助。

你的重新标签是错误的。您需要根据节点在
rcm
中的位置重新标记节点。下面的映射工作正常

import networkx as nx
import matplotlib.pyplot as plt
from networkx.utils import cuthill_mckee_ordering
G = nx.gnm_random_graph(n=30, m=55, seed=1)
rcm = list(cuthill_mckee_ordering(G))

d = {node:rcm.index(node) for node in G}
H = nx.relabel_nodes(G, mapping=d)
H_adj = nx.adjacency_matrix(H,nodelist=range(30))
plt.spy(H_adj)
plt.show()

谢谢,我误解了rcm
nodelist=range(30)
是捕获点,与MATLAB不同,Networkx中没有对节点排序。