我有以下坐标向量
LL = [lat lon]; % 5000 x 2
我想用以下方法计算所有元素与所有元素的距离:
[dist, ~] = deg2km(distance[lat1, lon1, lat2, lon2]);
因此,最终矩阵将是5000x5000。 BTW函数distance
来自 Mapping 工具箱。我一个接一个地尝试了一个循环,但它需要几个世纪才能运行。
更新
LL =
-79.49583374 40.029166991
-79.50416707 40.029166991
-79.50416707 40.037500324
D = pdist(LL, @(x2,x1)(deg2km(distance(x1(1),x1(2),x2(1),x2(2)))))
D =
2014.58795578131 2014.58795578131 0.168797611011563
虽然只是前两个坐标:
D = deg2km(distance(LL(1,2),LL(1,1),LL(2,2),LL(2,1)))
D =
0.709531880098433
----
请帮忙吗?
答案 0 :(得分:3)
我没有意识到distance
是一个Matlab函数,对不起。试试这个:
D = pdist(LL, @(x1,x2) (distance(x1(:,1),x1(:,2),x2(:,1),x2(:,2))))
@(x1,x2) (distance(x1(:,1),x1(:,2),x2(:,1),x2(:,2)))
做了什么?
这是一个匿名函数,需要两个输入x1
和x2
,每个输入应该 n -by- 2 。现在让我们假装 n 等于 1 。因此,pdist
会将来自LL
的每一对不同行作为输入x1
和x2
给我们的匿名函数。来自LL
的行的格式为[lat, lon]
,我们会得到两行。我们知道distance
需要distance(lat1,lon1,lat2,lon2)
。因此,如果x1
是LL
的一行,那么它是[lat1, lon1]
,因此x1(1)
实际上是lat1
而x1(2)
实际上是lon2
。与x2
和[lat2,lon2]
相同。
所以我们所有的匿名函数都在将distance
从一个带4个输入的函数转换为更加标准的Matlab距离函数,只接受2个输入。
修改强>
当你交换纬度和经度时,这可能对你有用:
D = pdist(LL, @(x1,x2) (distance(x1(:,2),x1(:,1),x2(:,2),x2(:,1))))
答案 1 :(得分:1)
试试这个:
D = pdist2(LL,LL, @distfun);