我需要用Matlab解决最小化问题,我想知道哪个是最简单的解决方案。我一直在思考的所有潜在解决方案都需要大量的编程工作。
假设我有一个纬度/经度坐标点(A,B),我需要的是在纬度/经度坐标的地图中搜索距离最近的点。
特别是,纬度和经度数组是2030x1354元素(1km距离)的两个矩阵,其目的是在那些矩阵中找到最小化到坐标(A,B)距离的唯一索引,即找到与给定坐标(A,B)最接近的值。
非常感谢任何帮助。
谢谢!
答案 0 :(得分:2)
让Lat
和Long
表示纬度和经度矩阵,然后
dist2=sum(bsxfun(@minus, cat(3,A,B), cat(3,Lat,Long)).^2,3);
[I,J]=find(dist2==min(dist2(:)));
I
和J
包含A
和B
中与最近点对应的索引。请注意,如果有多个答案,I
和J
将不是标量值,而是矢量。
答案 1 :(得分:2)
这总是很有趣:)
首先:只要
,Mohsen Nosratinia的答案就可以了对于给定的纬度,-180°和+ 180°经度实际上是相同点,因此仅仅查看角度之间的差异是不够的。这在极地地区将成为一个更大的问题,因为那里的经度差异会对实际距离产生较小的影响。
球面坐标对于导航,映射等等非常有用且实用。然而,对于空间计算,就像您尝试计算的表面距离一样,球面坐标实际上非常麻烦。
虽然可能直接使用角度进行此类计算,但我个人并不认为它非常实用:您通常必须拥有强大的球形背景三角学,以及了解其许多陷阱的丰富经验 - 通常有不稳定性或需要解决的“特殊点”(例如,极点),由于您引入的触发功能,您需要考虑的象限模糊度,等。
我已经学会在大学里做这一切,但我也了解到球形触发方法经常会引入复杂性,数学说话并不是严格要求的,换句话说,球形触发是< strong> 不 底层问题的最简单表示。
例如,如果将纬度和经度转换为3D笛卡尔X,Y,Z
坐标,然后通过简单公式找到距离,则距离问题非常微不足道
距离( a , b )= R·arccos( a / | a |· b / | b |)
其中 a 和 b 是球体上的两个这样的笛卡尔向量。请注意| a | = | b | = R
,地球半径为R = 6371
。
在MATLAB代码中:
% Some example coordinates (degrees are assumed)
lon = 360*rand(2030, 1354);
lat = 180*rand(2030, 1354) - 90;
% Your point of interest
P = [4, 54];
% Radius of Earth
RE = 6371;
% Convert the array of lat/lon coordinates to Cartesian vectors
% NOTE: sph2cart expects radians
% NOTE: use radius 1, so we don't have to normalize the vectors
[X,Y,Z] = sph2cart( lon*pi/180, lat*pi/180, 1);
% Same for your point of interest
[xP,yP,zP] = sph2cart(P(1)*pi/180, P(2)*pi/180, 1);
% The minimum distance, and the linear index where that distance was found
% NOTE: force the dot product into the interval [-1 +1]. This prevents
% slight overshoots due to numerical artifacts
dotProd = xP*X(:) + yP*Y(:) + zP*Z(:);
[minDist, index] = min( RE*acos( min(max(-1,dotProd),1) ) );
% Convert that linear index to 2D subscripts
[ii,jj] = ind2sub(size(lon), index)
如果你坚持跳过转换为笛卡尔并直接使用lat / lon,你必须使用Haversine公式,例如概述on this website,这也是{{1}使用的方法来自映射工具箱。
现在,所有这些对整个地球都有效,提供你会发现光滑的球形地球足够精确近似。如果你想要包括地球的扁率或一些更高阶的形状模型(或上帝禁止,距离包括 terrain ),你需要做更复杂的事情。但我不认为这是你的目标:)
PS - 我不会感到惊讶的是,如果你能写出我所做的一切,你可能会重新发现Haversine公式。我只是喜欢能够计算一些简单的东西,就像单独使用第一原理一样简单,而不是从很久以前植入脑中的一些黑盒公式计算出来:)