• Регистрация
Н/Д
Н/Д 0.00
н/д

Разбивка данных на ячейки в 2-D

22.07.2019

Всем привет! Опробуем новый hub. Вопрос в следующем:

имееются точки, расположенные на плоскости X,Y, с преобладанием в центральной части. 

Общий объем точек ~ 76 млн. Необходимо разбить эти точки на ячейки, сделать сетку.

Размер сетки 2000x2000.

Сделал стандартный алгоритм заполнения матрицы for  от i,j=1 до размера сетки с применением функции find. И второй алгоритм - заполнения по матрицы по спирали - начиная с центра c применением функции inpoly, используются for, switch. В итоге, на более мелкой сетке значительно лучше работает спираль, но при размере 2000, 3 дня считал и всего 96 тыс. насчитал из 4 млн. ячеек. А вот стандартный алгоритм справился за часов 18. Но это тоже никуда не годится. Необходимо добиться скорости вычислений до нескольких часов.

Компьютер: 16 Гб ОЗУ, 8 ядер. Средства параллельных вычислений не использую. Ресурсы видеокарты тоже не задействованы. 

Вопросы: 1. Существует ли встроенная матлабовская функция, выполняющая разбиение данных на сетку, ячейки? 2. Как ускорить вычисления? 

Есть ли похожие примеры из Вашей жизни? Поделитесь опытом, пожалуйста!

Теги

    22.07.2019

    Ответы

    • _______ ____________
      _______ ____________ -1.52
      22.07.2019 13:02

      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. Без кода сложно сказать, что там у Вас происходит. 

      • Павел Рословец
        Павел Рословец +239.28
        12.08.2019 10:01

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

        %% Создаем исходную матрицу
        mdim = [8700 9000]; % размер исходной матрицы
        r = rand(mdim(1), mdim(2)); % создаем случайную матрицу
        %% Задаем размер сетки
        grid = [2000 2000];
        %% Расширяем матрицу с учетом размера сетки
        gdim = ceil(size(r) ./ grid) .* grid; % высчитываем количество ячеек сетки
        h = zeros(gdim); % создаем вспомогательную нулевую матрицу
        h(1:size(r,1), 1:size(r,2)) = r; % Заполняем значения нулевой матрицы
        r = h; % заменяем исходную матрицу на расширенную
        clear h % очищаем память
        %% Разбиваем матрицу на сетку
        N1 = grid(1) * ones(1, size(r,1)/grid(1)); % высчитываем количество строк сетки
        N2 = grid(2) * ones(1, size(r,2)/grid(2)); % высчитываем количество столбцов сетки
        r = mat2cell(r, N1, N2); % разбиваем матрицу на ячейки

        На моем компьютере схожей конфигурации этот код выполняется 2 секунды. Так что циклы зло, изучайте возможности языка)

        Подробнее о работе с матрицами

        Кстати, если вы работаете с разреженными матрицами, можете использовать тип данных sparse, это будет еще эффективнее.

        • Н/Д
          Н/Д0.00
          10.09.2019 10:39

          Что то не то, что нужно. не увиде разбиение 76 млн. на сетку 2000 на 2000. В ячейках должныбыть порядковые номера этих точек и их количество разное. Например, если разбить диапазон от 0 до 1 на 100 участков (сетка 100 на 100), то в первую ячейку(1,1) попадуь все элементы, у котрых и X и Y находятс яв диапазоне от 0 до 0,01.