我有一个以 3 列格式 [x,y,z] 组织的 3D 点云,从第 4 列开始每个点的附加属性。请注意,所有点的距离是随机的。我正在尝试实现类似于 blockproc 的移动过滤器,以创建大小为 y,x 的 2D 矩阵,该矩阵沿 z 方向“展平”数据,并对体积中点云的给定属性进行平均。体积应该是沿 x 和 y 的固定大小的内核,我们称它们为 dx 和 dy,在其中将采用任何 z 的值。此外,体积应该能够滑动,例如移动步长(我们称它们为 xStep 和 yStep)不一定等于 dx 和 dy(尽管 dx=dy 和 xStep=yStep)。
到目前为止,我发现的 Matlab 函数有:
blockproc:具有实现滑动内核的能力,但适用于矩阵
accumarray:适用于离散点但没有滑动内核
这是我在概念上尝试做的卡通。该函数应该捕获红点并应用一个函数(例如mean、stdev)来计算红细胞的值。然后移动 xStep 并重新应用该功能。
知道如何实现这一目标吗?我已经坚持了一段时间。我写了一个函数来索引每次迭代的点,但是我的数据集相当大(>10^7 点),所以这种方法非常耗时。这个线程提供了一个使用 accumarray 的 MWE,没有滑动内核:
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:第一次发帖,如有错误请见谅