Сортировка 2D-массива в новом 2D-массиве (кластеризация K-menas) Java - PullRequest
1 голос
/ 17 июня 2020

В качестве входных данных у меня есть кластеры 2D-массива PointXY [] [], которые выглядят следующим образом:

[[23.237633,53.78671], [69.15293,17.138134], [23.558687,45.70517]] . . .
[[47.851738,16.525734], [47.802097,16.689285], [47.946404,16.732542]]
[[47.89601,16.638218], [47.833263,16.478987], [47.88203,16.45793]]
[[47.75438,16.549816], [47.915512,16.506475], [47.768547,16.67624]]
.
.
.

Таким образом, элементы в массиве имеют тип PointXY [], определенный следующим образом

public PointXY(float x, float y) { 
              this.x = x;
              this.y = y;  
          }

то, что я хотел бы сделать, это отсортировать входные кластеры и записать отсортированные в массив PointXY [] [] clusterSorted, чтобы каждый PointXY (кроме первой строки) в кластерах сравнивался с каждым значением первой строки. Другими словами, элементы из синего набора на картинке ниже сравниваются со всеми значениями, обведенными красным. Поэтому я хотел бы сравнить каждое значение, начиная со 2-й строки, с каждым значением в первой строке.

Picture1

Сравнение выполняется путем вызова евклидовой функции.

public double euclidian(PointXY other) {
              return Math.sqrt(Math.pow(this.x - other.x, 2)
                 + Math.pow(this.y - other.y, 2));
     }

Вывод должен быть двухмерного массива одного типа, но под каждым Точка, обведенная красным кружком (которая остается на том же месте в выходном массиве), должна быть точками из синей части, которые наиболее близки (по евклидовому расстоянию) к значению в красном кружке.

Picture2

Итак, это структура данных для кластеризации K-средних, так что каждый кластер представляет собой столбец (обведен зеленым), а первая точка - это центр (обведены красным) кластера и все другие точки (обведены желтым) в столбце - это точки, назначенные центру.

Итак, вопрос в том, как перебирать кластеры входного массива, сравнивать значения, как описано, и записывать их в кластеры массиваSorted.

EDIT: я хотел бы рассчитать евклидово расстояние между каждой точкой, выделенной синим кружком, со всеми значениями, обведенными красным. А затем отсортируйте их по минимальному евклидову расстоянию. Таким образом, в кластерах выходных массивов каждая отсортированная точка из набора, обведенного синим, будет находиться под ближайшей точкой, обведенной красным.

1 Ответ

0 голосов
/ 02 августа 2020

Создайте временный массив с плавающей запятой / двойным размером [n] [(n-1) * n], где входная матрица имеет размер [n] [n-1].

Вычислите евклидовы расстояния всех точек в нижней части матрицы со всеми точками в первой строке и сохраните их в соответствующих позициях во временном массиве.

Создайте копию каждого временного подмассива.

Выполните любую операцию сортировки копии, предпочтительно сортировку по выбору, поскольку вам нужно только частично отсортировать массив, пока не будут найдены самые низкие элементы n-1.

Наконец, создайте новый выходной массив размером [n ] [n-1], соответствуют наименьшим эвклидовым расстояниям своим точкам и сохраняют отсортированные (n-1) группы элементов из (n-1) точек прямо под их ближайшими опорными точками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...