Matlab 通过二维曲面中的投影分析三维点云

Matlab 通过二维曲面中的投影分析三维点云,matlab,matrix,vectorization,projection,Matlab,Matrix,Vectorization,Projection,我有一个3D点云(XYZ),其中Z可以是位置或能量。我想将它们投影到一个n×m网格中的2D表面上(在我的问题中,n=m),在Z为位置的情况下,每个网格单元的最大差值为Z,在Z为能量的情况下,总和为Z 例如,在0备注范围内: 所有这一切几乎可以是一个班轮通过大熊猫和切割方法 我已经重写了你的随机云初始化 你能做的就是 通过网格布局xy网格 在xy上投影云(简单边缘化) 通过kd树搜索找到最近的网格点,即将与每个云点关联的数据标记为网格节点 按标签对数据进行分组并评估您的本地统计数据(通过accu

我有一个3D点云(XYZ),其中
Z
可以是位置或能量。我想将它们投影到一个n×m网格中的2D表面上(在我的问题中,
n=m
),在
Z
为位置的情况下,每个网格单元的最大差值为
Z
,在
Z
为能量的情况下,总和为
Z

例如,在
0备注范围内:

  • 所有这一切几乎可以是一个班轮通过大熊猫和切割方法
  • 我已经重写了你的随机云初始化

  • 你能做的就是

  • 通过
    网格布局xy网格
  • 在xy上投影云(简单边缘化)
  • 通过
    kd树
    搜索找到最近的网格点,即将与每个云点关联的数据标记为网格节点
  • 按标签对数据进行分组并评估您的本地统计数据(通过
    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); 
    

    accumarray
    功能非常适合此类任务。首先,我定义示例数据:

    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
    
    我想

    • 表的三列分别代表x、y、z
    • 没有一个点的x小于栅格第一条边的x或大于最后一条边的x,y也是如此。也就是说,栅格覆盖所有点
    • 如果箱子不包含任何值,则结果应为
      NaN
      (如果需要其他填充值,只需更改
      accumarray
      的最后一个参数即可)
    然后:

    L=尺寸(表1);
    M=长度(x_分区);
    N=长度(y_分区);
    
    [~,ii]=max(repmat(表(:,1),1,M)+1两个答案。很高兴看到
    accumarray
    被巧妙地使用。accumarray
    有一个独特的学习曲线,但一旦你把它拿下来,它就会打开大门。@chappjc我喜欢所有这些输入参数(对accumarray来说),我一开始觉得几乎没用,结果却完全满足了我的需要;-)
    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);
    ii = ii-1; % by assumption, all values in ii will be at least 2, so we subtract 1
    jj = jj-1; % same for jj
    result_maxdif = accumarray([ii jj], table(:,3), [M-1 N-1], @(v) max(v)-min(v), NaN);
    result_sum = accumarray([ii jj], table(:,3), [M-1 N-1], @sum, NaN);