我有一个三维点云(XYZ),其中Z可以是位置或能量我想把它们放在一个n×m网格中的2D曲面上(在我的问题n = m)中,每个网格单元都有一个最大值差Z的值,在Z位置的情况下,或者在Z上求和的值,在Z是能量的情况下。
例如,在0 <= (x,y) <= 20范围内,有500个点假设XY平面有N个M分区,例如4×4,我的意思是,在xy方向中,我们有4个分区,其间隔为5(使其最大为ccc>)。现在,这些单元中的每一个都应该具有在定义的XY平面中的相应列中的那些点的20值的求和或最大差的值。
我做了一个简单的XYZ数组,用于下面的测试,在这里,Z表示每个点的能量。

n=1;
for i=1:2*round(random('Uniform',1,5))
    for j=1:2*round(random('Uniform',1,5))
        table(n,:)=[i,j,random('normal',1,1)];
        n=n+1;
    end
end

没有循环怎么能做到?

最佳答案

评论:
所有这些几乎可以通过python pandas和切割方法一行完成。
我重写了你的随机云初始化
你能做的就是
通过meshgrid布置xy网格,
在xy上投影云(简单边缘化)
通过kd-tree搜索查找最近的网格点,即将与每个云点关联的数据标记为网格节点
按标签对数据分组并评估本地统计数据(通过accumarray)。
下面是一个工作示例:

 samples = 500;
 %data extrema
 xl = 0; xr = 1; yl = 0; yr = 1;

 % # grid points
 sz = 20;
 % # new random cloud
 table = [random('Uniform',xl,xr,[samples,1]) , random('Uniform',yr,yl,[samples,1]), random('normal',1,1,[samples,1])];

 figure; scatter3(table(:,1),table(:,2),table(:,3));

 % # grid construction
 xx = linspace(xl,xr,sz); yy = linspace(yl,yr,sz);
 [X,Y] = meshgrid(xx,yy);
 grid_centers = [X(:),Y(:)];

 x = table(:,1); y = table(:,2);

 % # kd-tree
 kdtreeobj = KDTreeSearcher(grid_centers);
 clss = kdtreeobj.knnsearch([x,y]); % # classification

 % # defintion of local statistic
 local_stat = @(x)sum(x) % # for total energy
 % local_stat = @(x)max(x)-min(x) % # for position off-set

 % # data_grouping
 class_stat = accumarray(clss,table(:,3),[],local_stat );
 class_stat_M  = reshape(class_stat , size(X)); % # 2D reshaping

 figure; contourf(xx,yy,class_stat_M,20);

关于matlab - 通过在2D曲面中投影来分析3D点云,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19865144/

10-11 22:42
查看更多