Построение матрицы смежности из значений треугольника Делоне - PullRequest
0 голосов
/ 04 мая 2018

У меня есть большая матрица, содержащая трехмерные координаты точек, и я хочу иметь матрицу смежности с ними, используя результаты триангуляции Делоне. Чтобы получить их значения триангуляции Делоне, я использовал пакет '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)

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

1 Ответ

0 голосов
/ 04 мая 2018

Возможно с пакетом 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

EDIT

Есть что-то странное. Мне нужно перевернуть матрицу 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
...