繁体   English   中英

在matlab网格中找到最近的点

[英]Find closest point in matlab grid

天儿真好

我正在尝试编写一种智能方法来找到沿着轮廓的点的最近网格点。

网格是一个二维网格,存储在xy (包含网格单元的x和y公里位置)中。

轮廓是由x和y位置组成的线,不一定是规则间隔的。

如下所示 - 红点是网格,蓝点是轮廓上的点。 如何找到最接近每个蓝点的红点的索引?

插入最接近每个蓝点的红点

编辑 - 我应该提到网格是纬度/经度网格,是一个非常接近南极的区域。 因此,点(红点)是距离南极的米的位置(使用极坐标立体图)。 由于网格是地理网格,因此网格间距不相等 - 由于高纬度地区的扭曲,形状单元格略有不同(红点定义了单元格的顶点)。 结果是我不能只找到xy矩阵的哪一行/哪一列最接近输入点坐标 - 与meshgrid的常规网格meshgrid ,行列中的值变化...

干杯戴夫

通常的方法是:

for every blue point {
    for every red point {
        is this the closest so far
    }
}

但更好的方法是将红色数据放入kd树中。 这是一个沿着它的平均值分割数据的树,然后沿着它们的平均值分割两个数据集,直到你将它们分成树结构。

在此输入图像描述

这会将您的搜索效率从O(n*m)改为O(log(n)*m)

这是一个图书馆:

http://www.mathworks.com.au/matlabcentral/fileexchange/4586-kd-tree

该库将为您提供从数据中轻松制作kd树并搜索其中最近点的方法。

或者你可以使用四叉树,不是简单但相同的想法。 (你可能要为此编写自己的库)

确保最大的数据集(在这种情况下是您的红点)进入树中,因为这将减少最大的时间。

我想我找到了一种方法,使用nearestgriddata标志来做到这griddata

我创建了一个与网格xy矩阵大小相同的矩阵,但是填充了相应矩阵元素的线性索引。 这是通过将矢量( 1:size(x,1)*size(x,2) )整形为与x相同的尺寸而形成的。

然后我使用griddatanearest标志来找到最接近我的轮廓上每个点的点的线性索引(蓝点)。 然后,简单地用ind2sub转换回下标符号留给我一个2行向量,描述最接近蓝点轮廓上每个点的点的矩阵下标。

下图显示了轮廓(蓝点),网格(红点)和最近的网格点(绿点)。

网格化的结果

这是我使用的代码片段:

index_matrix1 = 1:size(x,1)*size(x,2); 
index_matrix1 = reshape(index_matrix1,size(x));
lin_ind = griddata(x,y,index_matrix1,CX,CY,'nearest'); % where CX and CY are the coords of the contour
[sub_ind(1,:),sub_ind(2,:)] = ind2sub(size(x),lin_ind);

我想在立体表示中,你的点在r - theta坐标中形成一个整齐的网格。 (我对此不太熟悉,如果我错了,请纠正我。我的建议可能仍然适用)。

对于绘图,您可以从立体图转换为纬度 - 经度,从而扭曲网格。 但是,为了找到最近的点,可以考虑将蓝色轮廓点的纬度 - 经度转换为立体坐标,其中很容易使用其rtheta值确定每个点的单元格。

如果可以在立体表示中索引单元格,则转换为另一个表示时索引将相同。

主要的要求是,在一些变换,网格点由两个向量,定义XY ,使得对于任何xXyY(x, y)是一个网格点。 接下来通过该变换转换网格和轮廓点。 然后给定一个任意点(x1, y1) ,我们可以通过找到最接近xx1和最接近yy1来找到合适的网格单元。 变换回以获得所需坐标系中的点。

dsearchn :ND最近点搜索。

[k, d] = dsearchn(A,B) :将距离d返回到最近的点。 d是长度为p的列向量。

http://au.mathworks.com/help/matlab/ref/dsearchn.html?s_tid=gn_loc_drop

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM