Трехмерная матрица в двухмерную матрицу смежности или список краев

Рассмотрим куб 3 x 3 x 3, в котором каждый из 27 элементов соединен с другими элементами вдоль граней. Элемент в форме куба имеет 6 сторон, поэтому для каждого элемента возможно максимум 6 соединений (например, самый центральный элемент в кубе 3 x 3 x 3 ограничен 6 элементами и имеет 6 соединений).

Затем пусть m1, m2 и m3 будут первым, вторым и третьим слоями куба соответственно. Имя каждого элемента - xyz, где x, y, z - это номер строки, номер столбца и номер слоя элемента. Например, элемент 213 находится во второй строке, первом столбце и 3-м слое куба. Этот элемент соединен с 4 другими элементами: три находятся в его слое (113, 313, 223), а один - на один слой выше него (212).

x = 3 # nrow
y = 3 # ncol
z = 3 # nlay

# print each layer as a 2D matrix
for(k in 1:z){
  m = paste0(rep(1:x, each=x), rep(1:y, times = y), k)
  print(matrix(m, nrow=x, byrow=T))
}

     [,1]  [,2]  [,3] 
[1,] "111" "121" "131"
[2,] "211" "221" "231"
[3,] "311" "321" "331"
     [,1]  [,2]  [,3] 
[1,] "112" "122" "132"
[2,] "212" "222" "232"
[3,] "312" "322" "332"
     [,1]  [,2]  [,3] 
[1,] "113" "123" "133"
[2,] "213" "223" "233"
[3,] "313" "323" "333"

Есть ли в igraph или связанном пакете готовая функция для создания либо матрицы смежности, либо списка ребер для такой сети? Мне нужно решение, которое масштабируется до любого количества строк, столбцов и слоев. Решения Python приветствуются.

Я вручную создал двухмерную матрицу смежности, где строки и столбцы заданы c(m1, m2, m3) ниже:

m1 = paste0(rep(1:x, each=x), rep(1:y, times = y), 1)
m2 = paste0(rep(1:x, each=x), rep(1:y, times = y), 2)
m3 = paste0(rep(1:x, each=x), rep(1:y, times = y), 3)
c(m1, m2, m3)
 [1] "111" "121" "131" "211" "221" "231" "311" "321" "331" "112" "122" "132" "212" "222" "232" "312" "322" "332"
[19] "113" "123" "133" "213" "223" "233" "313" "323" "333"

В этом простом примере матрица смежности разреженная, имеет нули по диагонали и является симметричной. Это выглядит так:

введите здесь описание изображения

И вот dput() для C&P и подтверждения с помощью.

dput(temp)
structure(c(0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 
1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 
1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 
1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 
1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0), .Dim = c(27L, 
27L), .Dimnames = list(c("111", "121", "131", "211", "221", "231", 
"311", "321", "331", "112", "122", "132", "212", "222", "232", 
"312", "322", "332", "113", "123", "133", "213", "223", "233", 
"313", "323", "333"), c("111", "121", "131", "211", "221", "231", 
"311", "321", "331", "112", "122", "132", "212", "222", "232", 
"312", "322", "332", "113", "123", "133", "213", "223", "233", 
"313", "323", "333")))

person Rich Pauloo    schedule 17.04.2019    source источник


Ответы (2)


Когда манхэттенское расстояние между узлами равно 1, есть край, поэтому вы можете использовать dist() в R для создания матрицы смежности:

cube_mat = expand.grid(
    x = 1:3,
    y = 1:3,
    z = 1:3
)

m_dist = as.matrix(dist(cube_mat[, 1:3], method = "manhattan", diag = TRUE))
# Zero out any distances != 1
m_dist[m_dist != 1] = 0
rownames(m_dist) = paste0(cube_mat$x, cube_mat$y, cube_mat$z)
colnames(m_dist) = paste0(cube_mat$x, cube_mat$y, cube_mat$z)
# Plot of the adjacency matrix (looks reversed because 111 is in the bottom left):
image(m_dist)
person Marius    schedule 17.04.2019

Если вы хотите просто использовать функцию пакета из igraph:

#adj <- my.adjacency.matrix
as_edgelist(graph.adjacency(adj))

В общем, вы можете использовать функции в пакете igraph для перехода между списками редакторов, матрицами смежности, а также создавать графики с помощью plot.igraph. Вот куб по умолчанию:

plot.igraph(graph.adjacency(adj))

график сети по умолчанию

person Dij    schedule 17.04.2019