У меня есть матрицу 8x8:Пометка соседних точек в матрице
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 1 1 0 0 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 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1
код для его создания:
examplemat <- matrix(c(1, 1, rep(0, 6), 1, rep(0, 9), 1, 1, rep(0, 17), 1, rep(0, 7), 1, rep(0, 5), 1, rep(0, 11), 1), 8, 8, byrow=T)
Те, которые были извлечены как координаты:
onecoords <- which(examplemat == 1, arr.ind=T)
row col
[1,] 1 1
[2,] 2 1
[3,] 1 2
[4,] 3 3
[5,] 3 4
[6,] 7 4
[7,] 5 6
[8,] 6 6
[9,] 8 8
I нужен простой, векторный подход к кластеризации этих групп в группы смежных координат. (Для целей этой задачи я хотел бы добавить 4-позиционное смещение вверх/вниз/влево/вправо, но вам также может понадобиться опция 8-позиционной смежности, включая диагонали.)
В этом примере мы бы в конечном итоге с 5 кластеров клеток:
row col clus
[1,] 1 1 A
[2,] 2 1 A
[3,] 1 2 A
[4,] 3 3 B
[5,] 3 4 B
[6,] 7 4 C
[7,] 5 6 D
[8,] 6 6 D
[9,] 8 8 E
4-позиционная проверка смежности довольно проста: sum(abs(onecoords[1,] - onecoords[2,])) == 1
Но я изо всех сил, чтобы решить, как эффективно векторизации это.
Вы могли бы найти что-то [здесь] (http://stackoverflow.com/questions/6518133/clustering-list-for-hclust-function) полезно и, надеюсь, достаточно общее; например здесь 'cbind (onecoords, clus = cutree (hclust (dist (onecoords," maximum ")), h = 1))' –
Я согласен с тем, что некоторое использование функции «dist» или более общей функции расстояния Mahalanobis поможет. –