天儿真好
我正在尝试编写一种智能方法来找到沿轮廓点的最近点网格点。
网格是一个二维网格,存储在x
和y
中(包含网格单元格的x和y公里位置)。
轮廓是一条线,由x和y位置组成,不一定是规则间隔。
如下所示 - 红点是网格,蓝点是轮廓上的点。如何找到最接近每个蓝点的红点的索引?
编辑 - 我应该提到网格是纬度/经度网格,是一个非常接近南极的区域。因此,点(红点)是距离南极的米的位置(使用极坐标立体图)。由于网格是地理网格,因此网格间距不相等 - 由于高纬度地区的扭曲,形状单元格略有不同(红点定义单元格的顶点)。
结果是我无法找到x
和y
矩阵的哪一行/列最接近输入点坐标 - 与meshgrid
中的常规网格不同,其值为行和列各不相同......
干杯 戴夫
答案 0 :(得分:10)
通常的方法是:
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-k-d-tree
该库将为您提供从数据中轻松制作kd树并搜索其中最近点的方法。
或者你可以使用四叉树,而不是简单但相同的想法。 (你可能必须为此编写自己的库)
确保最大的数据集(在本例中为红点)进入树中,因为这样可以减少最大的时间。
答案 1 :(得分:2)
我想我已经找到了一种方法,可以使用nearest
的{{1}}标记来做到这一点。
我制作一个与网格griddata
和x
矩阵大小相同的矩阵,但是填充了相应矩阵元素的线性索引。这是通过将矢量(y
)重塑为与1:size(x,1)*size(x,2)
相同的维度而形成的。
然后我使用x
和griddata
标志来查找最接近轮廓上每个点的点的线性索引(蓝点)。然后,简单地用nearest
转换回下标符号给我留下了2行向量,描述了最接近蓝点轮廓上每个点的点的矩阵下标。
下图显示了轮廓(蓝点),网格(红点)和最近的网格点(绿点)。
这是我使用的代码段:
ind2sub
答案 2 :(得分:1)
我认为在立体图表示中,您的点在r
- theta
坐标中形成一个整齐的网格。 (我对此不太熟悉,如果我错了,请纠正我。我的建议可能仍然适用。)
对于绘图,您可以从立体图转换为纬度 - 经度,从而扭曲网格。但是,为了找到最近的点,可以考虑将蓝色轮廓点的纬度 - 经度转换为立体坐标,使用其r
和theta
值可以轻松确定每个点的单元格。 / p>
如果可以在立体表示中索引单元格,则在转换为另一种表示时索引将是相同的。
主要要求是在某些变换下,网格点由两个向量X
和Y
定义,以便x
和X
中的任何y
在Y
中{1}},(x, y)
是一个网格点。接下来通过该变换转换网格和轮廓点。然后给定一个任意点(x1, y1)
,我们可以通过找到最接近的x
到x1
和最近的y
到y1
找到合适的网格单元格。向后变换以获得所需坐标系中的点。
答案 3 :(得分:1)
dsearchn
:N-D最近点搜索。
[k, d] = dsearchn(A,B)
:将距离d返回到最近的点。 d是长度为p的列向量。
http://au.mathworks.com/help/matlab/ref/dsearchn.html?s_tid=gn_loc_drop