2

我有一个巨大的 3D 点云,[3x40e6]。它是一个平面的点云,所以在这个意义上它更像是 2.5D。我想将点云合并到一个固定的网格范围中,这样我就可以将它放入一个 2D 矩阵并使用 imagesc(mymap)查看它。

我确实解决了这个问题,但是时间太长了。这是我到目前为止得到的。它工作正常,但需要 10 分钟。它插入了所有类型的 jive,我不需要。

xlin=linspace(min(xx),max(xx),meshsz*dxxyy);
ylin=linspace(min(yy),max(yy),meshsz);
[X,Y]=meshgrid(xlin,ylin);
disp('+ Flattening (X,Y,Z) information into 2D (X,Y)(Z) mesh..')
%Fit to 2D grid (takes a long time)
Z=griddata(xx,yy,zz,X,Y);%,'cubic');

我真正想做的是将我的 [3xN] 向量中的所有数据合并到我的特定 2D 范围图中。我想我必须将所有值合并到该地图中(有一些出色且快速的合并算法),但我还需要其中的特定 Z 坐标标量,因为这是我想要在每个 bin 中平均的值。

谢谢!

4

2 回答 2

2

这是您可以一步完成的方法。accumarray允许您轻松交换用于组合数据的函数,以便您可以使用例如std查看局部可变性或numel查看每个 bin 中的计数。

%# transform your x,y coordinates to pixel (=bin) values
minX = min(xx);
maxX = max(xx);
minY = min(yy);
maxY = max(yy);

targetSize = [512 512];

xxBin = round( (xx-minX)/(maxX-minX)*(targetSize(1)-1) ) +1;
yyBin = round( (yy-minY)/(maxY-minY)*(targetSize(2)-1) ) +1;

%# map by using accumarray, take the mean of each bin 
map = accumarray([xxBin(:),yyBin(:)],zz,targetSize,@mean,0);
于 2013-01-19T18:30:48.407 回答
0

解决了。每百万点需要 200 毫秒。

yidx=[min(yy):dy:max(yy)];
xidx=[min(xx):dx:max(xx)];
ZmapSum=zeros(length(yidx),length(xidx));
ZmapIdx=zeros(size(ZmapSum));

[nx,binx] = histc(xx,xidx);
[ny,biny] = histc(yy,yidx);
%bin==0 means the value is out of range
binx=binx+1; biny=biny+1;
%binzero=( (binx==0) | (biny==0) );
%binx(binzero) = [];
%biny(binzero) = [];
%xx(binzero) = [];
%yy(binzero) = [];
%zz(binzero) = [];

%binx and biny give their respective bin locations
for i=1:1:length(xx)
    ZmapSum(biny(i),binx(i))=ZmapSum(biny(i),binx(i))+zz(i);
    ZmapIdx(biny(i),binx(i))=ZmapIdx(biny(i),binx(i))+1;
end

Zmap=ZmapSum./ZmapIdx;
于 2013-01-19T15:32:35.947 回答