Усредняющие свойства трехмерного облака точек на двумерной сетке со скользящим ядром (Matlab) - PullRequest
0 голосов
/ 14 мая 2018

У меня есть трехмерное облако точек, организованное в формате из трех столбцов [x, y, z], с дополнительными свойствами каждой точки, начиная со столбца 4 и далее. Обратите внимание, что расстояние всех точек является случайным. Я пытаюсь реализовать движущийся фильтр, похожий на blockproc, чтобы создать двумерную матрицу размера y, x, которая «выравнивает» данные по z и усредняет заданное свойство облака точек в объеме. Объем должен быть ядром фиксированного размера по x и y, назовем их dx и dy, в пределах которых будут приниматься значения любого z. Кроме того, том должен иметь возможность скользить, поэтому, например, движущиеся шаги (давайте назовем их xStep и yStep) не обязательно равны dx и dy (хотя dx = dy и xStep = yStep).

Пока что найдены следующие функции Matlab:

blockproc : имеет возможность реализовать скользящее ядро, но работает с матрицами

accumarray : работает на дискретных точках, но без скользящего ядра

3D points and moving block Вот мультик того, что я пытаюсь сделать концептуально. Функция должна захватывать красные точки и применять функцию (например, среднее значение, stdev) для вычисления значения красной ячейки. Затем перейдите по xStep и повторно примените функцию.

Есть идеи, как мне этого добиться? Я застрял на этом некоторое время. Я написал функцию, которая индексирует точки на каждой итерации, но мои наборы данных довольно большие (> 10 ^ 7 баллов), поэтому этот подход очень трудоемкий. Этот поток предоставляет MWE с использованием accmarray, без скользящего ядра:

table = [ 20*rand(1000,1) 30*rand(1000,1) 40*rand(1000,1)]; % random data
x_partition = 0:2:20; % partition of x axis
y_partition = 0:5:30; % partition of y axis
L = size(table,1);
M = length(x_partition);
N = length(y_partition);
[~, ii] = max(repmat(table(:,1),1,M) <= repmat(x_partition,L,1),[],2);
[~, jj] = max(repmat(table(:,2),1,N) <= repmat(y_partition,L,1),[],2);
% Calculate the sum
result_sum = accumarray([ii jj], table(:,3), [M N], @sum, NaN);

Любая информация будет принята с благодарностью, спасибо! PS: Первый пост здесь, извините, если есть плохое форматирование

...