У меня есть трехмерное облако точек, организованное в формате из трех столбцов [x, y, z], с дополнительными свойствами каждой точки, начиная со столбца 4 и далее. Обратите внимание, что расстояние всех точек является случайным. Я пытаюсь реализовать движущийся фильтр, похожий на blockproc, чтобы создать двумерную матрицу размера y, x, которая «выравнивает» данные по z и усредняет заданное свойство облака точек в объеме. Объем должен быть ядром фиксированного размера по x и y, назовем их dx и dy, в пределах которых будут приниматься значения любого z. Кроме того, том должен иметь возможность скользить, поэтому, например, движущиеся шаги (давайте назовем их xStep и yStep) не обязательно равны dx и dy (хотя dx = dy и xStep = yStep).
Пока что найдены следующие функции Matlab:
blockproc : имеет возможность реализовать скользящее ядро, но работает с матрицами
accumarray : работает на дискретных точках, но без скользящего ядра
Вот мультик того, что я пытаюсь сделать концептуально. Функция должна захватывать красные точки и применять функцию (например, среднее значение, 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: Первый пост здесь, извините, если есть плохое форматирование