Разбивка данных на ячейки в 2-D
Всем привет! Опробуем новый hub. Вопрос в следующем:
имееются точки, расположенные на плоскости X,Y, с преобладанием в центральной части.
Общий объем точек ~ 76 млн. Необходимо разбить эти точки на ячейки, сделать сетку.
Размер сетки 2000x2000.
Сделал стандартный алгоритм заполнения матрицы for от i,j=1 до размера сетки с применением функции find. И второй алгоритм - заполнения по матрицы по спирали - начиная с центра c применением функции inpoly, используются for, switch. В итоге, на более мелкой сетке значительно лучше работает спираль, но при размере 2000, 3 дня считал и всего 96 тыс. насчитал из 4 млн. ячеек. А вот стандартный алгоритм справился за часов 18. Но это тоже никуда не годится. Необходимо добиться скорости вычислений до нескольких часов.
Компьютер: 16 Гб ОЗУ, 8 ядер. Средства параллельных вычислений не использую. Ресурсы видеокарты тоже не задействованы.
Вопросы: 1. Существует ли встроенная матлабовская функция, выполняющая разбиение данных на сетку, ячейки? 2. Как ускорить вычисления?
Есть ли похожие примеры из Вашей жизни? Поделитесь опытом, пожалуйста!
Ответы
1.
Документация https://www.mathworks.com/help/matlab/ref/double.discretize.html
Ответ в comunity
https://www.mathworks.com/matlabcentral/answers/322113-binning-data-with-2d-coordinates
2. Без кода сложно сказать, что там у Вас происходит.
В вашем случае для ускорения параллельные вычисления не требуются, достаточно правильно применить матричный язык MATLAB. Вот пример, который делает то, что вам нужно:
На моем компьютере схожей конфигурации этот код выполняется 2 секунды. Так что циклы зло, изучайте возможности языка)
Подробнее о работе с матрицами
Кстати, если вы работаете с разреженными матрицами, можете использовать тип данных sparse, это будет еще эффективнее.
Что то не то, что нужно. не увиде разбиение 76 млн. на сетку 2000 на 2000. В ячейках должныбыть порядковые номера этих точек и их количество разное. Например, если разбить диапазон от 0 до 1 на 100 участков (сетка 100 на 100), то в первую ячейку(1,1) попадуь все элементы, у котрых и X и Y находятс яв диапазоне от 0 до 0,01.