Построение матрицы смежности из значений треугольника Делоне

У меня есть большая матрица, содержащая 3D-координаты точек, и я хочу иметь их матрицу смежности, используя их результаты триангуляции Делоне. Чтобы получить их значения триангуляции Делоне, я использовал пакет 'geometry'. Чтобы иметь пример того, что у меня есть, я подготовил следующие коды:

values<-rnorm(12,mean = 10, 5)

mat<-matrix(values,ncol = 3)

dimnames(mat)<-list(c("asd","qwe","rty","poi"),c("x","y","z"))

require("geometry")

delaunaynMat<-delaunayn(mat)

Однако я не смог найти подходящей функции для построения матрицы смежности по результатам Делоне. Любая идея об этом?


person minoo    schedule 04.05.2018    source источник


Ответы (1)


Возможно с пакетом DatabionicSwarm

> library(DatabionicSwarm)
> Delaunay4Points(mat, IsToroid=FALSE)
  1 2 3 4
1 0 1 1 1
2 1 0 1 1
3 1 1 0 0
4 1 1 0 0

Или с deldir (только для 2D):

> require(deldir) 
Loading required package: deldir
deldir 0.1-15
> set.seed(42) 
> x <- runif(6) 
> y <- runif(6) 
> dxy <- deldir(x,y) 
> ind <- dxy$dirsgs[,5:6] 
> adj <- matrix(0, length(x), length(y)) 
> for (i in 1:nrow(ind)){ 
+     adj[ind[i,1], ind[i,2]] <- 1 
+     adj[ind[i,2], ind[i,1]] <- 1 
+ } 
> adj 
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0    1    0    1    0    0
[2,]    1    0    0    1    1    0
[3,]    0    0    0    0    1    1
[4,]    1    1    0    0    1    1
[5,]    0    1    1    1    0    1
[6,]    0    0    1    1    1    0

РЕДАКТИРОВАТЬ

Есть что-то странное. Мне нужно перевернуть матрицу Delaauny4Points, чтобы получить результаты, соответствующие deldir:

set.seed(42) 
x <- runif(6) 
y <- runif(6) 
dxy <- deldir(x,y) 
ind <- dxy$delsgs[,5:6] 
adj <- matrix(0, length(x), length(y)) 
for (i in 1:nrow(ind)){ 
    adj[ind[i,1], ind[i,2]] <- 1 
    adj[ind[i,2], ind[i,1]] <- 1 
} 
adj
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0    1    0    1    0    1
[2,]    1    0    1    1    1    0
[3,]    0    1    0    0    1    1
[4,]    1    1    0    0    1    1
[5,]    0    1    1    1    0    1
[6,]    1    0    1    1    1    0

> Delaunay4Points(cbind(x,y), IsToroid=FALSE)[6:1,6:1] # <- look
  6 5 4 3 2 1
6 0 1 0 1 0 1
5 1 0 1 1 1 0
4 0 1 0 0 1 1
3 1 1 0 0 1 1
2 0 1 1 1 0 1
1 1 0 1 1 1 0
person Stéphane Laurent    schedule 04.05.2018
comment
@Laurent Большое спасибо за ваш ответ. Это было превосходно. Поскольку моя матрица содержит трехмерные координаты, я думаю, что первое решение мне подходит. - person minoo; 04.05.2018
comment
@minoo К сожалению, я не уверен. Посмотрите здесь: stackoverflow.com /вопросы/50175867/ - person Stéphane Laurent; 05.05.2018
comment
@minoo Если вы используете Windows, вы можете попробовать мой пакет: github.com/stla/delaunayadjacency (в настоящее время он работает только на окнах) - person Stéphane Laurent; 05.05.2018