[英]Find closest point in matlab grid
天儿真好
我正在尝试编写一种智能方法来找到沿着轮廓的点的最近网格点。
网格是一个二维网格,存储在x
和y
(包含网格单元的x和y公里位置)中。
轮廓是由x和y位置组成的线,不一定是规则间隔的。
如下所示 - 红点是网格,蓝点是轮廓上的点。 如何找到最接近每个蓝点的红点的索引?
编辑 - 我应该提到网格是纬度/经度网格,是一个非常接近南极的区域。 因此,点(红点)是距离南极的米的位置(使用极坐标立体图)。 由于网格是地理网格,因此网格间距不相等 - 由于高纬度地区的扭曲,形状单元格略有不同(红点定义了单元格的顶点)。 结果是我不能只找到x
和y
矩阵的哪一行/哪一列最接近输入点坐标 - 与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树并搜索其中最近点的方法。
或者你可以使用四叉树,不是简单但相同的想法。 (你可能要为此编写自己的库)
确保最大的数据集(在这种情况下是您的红点)进入树中,因为这将减少最大的时间。
我想我找到了一种方法,使用nearest
的griddata
标志来做到这griddata
。
我创建了一个与网格x
和y
矩阵大小相同的矩阵,但是填充了相应矩阵元素的线性索引。 这是通过将矢量( 1:size(x,1)*size(x,2)
)整形为与x
相同的尺寸而形成的。
然后我使用griddata
和nearest
标志来找到最接近我的轮廓上每个点的点的线性索引(蓝点)。 然后,简单地用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
坐标中形成一个整齐的网格。 (我对此不太熟悉,如果我错了,请纠正我。我的建议可能仍然适用)。
对于绘图,您可以从立体图转换为纬度 - 经度,从而扭曲网格。 但是,为了找到最近的点,可以考虑将蓝色轮廓点的纬度 - 经度转换为立体坐标,其中很容易使用其r
和theta
值确定每个点的单元格。
如果可以在立体表示中索引单元格,则转换为另一个表示时索引将相同。
主要的要求是,在一些变换,网格点由两个向量,定义X
和Y
,使得对于任何x
在X
和y
在Y
, (x, y)
是一个网格点。 接下来通过该变换转换网格和轮廓点。 然后给定一个任意点(x1, y1)
,我们可以通过找到最接近x
到x1
和最接近y
到y1
来找到合适的网格单元。 变换回以获得所需坐标系中的点。
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.