我目前正在使用帶有標記邊緣的圖形。原始鄰接矩陣是一個形狀為 [n_nodes, n_nodes, n_edges] 的矩陣,如果節點 i 和 j 通過邊 k 連接,則每個單元 [i,j, k] 為 1。
我需要創建原始圖的反轉,其中節點成為邊,邊成為節點,所以我需要一個形狀為 [n_edges, n_edges, n_nodes] 的新矩陣,其中每個單元格 [i,j,k] 如果邊為 1 i 和 j 有 k 作為公共頂點。

下面的代碼正確地完成了任務,但是使用 5 個嵌套的 for 回圈太慢了,處理我必須處理的大量圖形似乎需要大約 700 小時。
有沒有更好的方法來實作這一點?
n_nodes = extended_adj.shape[0]
n_edges = extended_adj.shape[2]
reversed_graph = torch.zeros(n_edges, n_edges, n_nodes, 1)
for i in range(n_nodes):
for j in range(n_nodes):
for k in range(n_edges):
#If adj_mat[i][j][k] == 1 nodes i and j are connected with edge k
#For this reason the edge k must be connected via node j to every outcoming edge of j
if extended_adj[i][j][k] == 1:
#Given node j, we need to loop through every other possible node (l)
for l in range(n_nodes):
#For every other node, we need to check if they are connected by an edge (m)
for m in range(n_edges):
if extended_adj[j][l][m] == 1:
reversed_graph[k][m][j] = 1
謝謝是提前。
uj5u.com熱心網友回復:
與上述評論相呼應,這種圖形表示幾乎可以肯定是繁瑣且低效的。但盡管如此,讓我們定義一個沒有回圈的矢量化解決方案,并盡可能使用張量視圖,這對于計算更大的圖應該是相當有效的。
為了清楚起見,讓我們使用[i,j,k]索引G(原始圖)和[i',j',k']索引G'(新圖)。讓我們縮短n_edgestoe和n_nodesto n。
考慮二維矩陣slice = torch.max(G,dim = 1)。在該切片的每個坐標[a,b]處,1 表示該節點a通過邊連接b到某個其他節點(我們不關心哪個)。
slice = torch.max(G,dim = 1) # dimension [n,e]
我們正在尋找解決方案的路上,但我們需要一個運算式來告訴我們是否a連接到邊緣b和另一個邊緣c,對于所有邊緣c。我們可以b,c通過擴展slice、復制和轉置來映射所有組合,并尋找兩者之間的交集。
expanded_dim = [slice.shape[0],slice.shape[1],slice.shape[1]] # value [n,e,e]
# two copies of slice, expanded on different dimensions
expanded_slice = slice.unsqueeze(1).expand(expanded_dim) # dimension [n,e,e]
transpose_slice = slice.unsqueeze(2).expand(expanded_dim) # dimension [n,e,e]
G = torch.bitwise_and(expanded_slice,transpose_slice).int() # dimension [n,e,e]
G[i',j',k']現在等于 1 iff 節點i'通過邊連接j'到其他節點,并且節點i'通過邊連接k'到其他節點。如果j' = k'值是 1,只要該邊的端點之一是i'。
最后,我們重新排序尺寸以獲得您想要的形式。
G = torch.permute(G,(1,2,0)) # dimension [e,e,n]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/449398.html
