1

这表示一些帮助,我碰到它使用MATLAB脚本旅行商的解决方案,并在它的代码,我发现,它使用的表示所谓的城市坐标,它看起来像:需要对旅行商问题

CityCood = [0.4000,0.2439,0.1707,0.2239,0.5171;0.4439,0.1463,0.2293,0.7610,0.9414] 

5个城市。

在这一点上,我对作者是如何得到这种表示的能力一无所知,因为从我目前看到的情况来看,手头的信息应该是一个5×5对称矩阵,表示这五个中任意两个之间的距离城市。

所以,如果有人能给我一个关于如何基于坐标的表示法的想法,我将不胜感激。提前致谢。

+1

考虑使用骆驼大小写变量名称:* cityCoord *而不是* CityCoord *。 – zellus 2010-11-29 17:51:06

回答

5

CityCoord(我认为有一个字母缺失)是一个2×5的数组。我认为这意味着CityCoord包含每个城市的两个坐标(x,y)。

要创建一个5×5距离矩阵,你可以叫

squareform(pdist(CityCoord')) 
+0

太好了。如果我手边已经有距离矩阵,那么呢?比如说,我知道5个城市A,B,C,D,E中每个城市的城际距离? – Kevin 2010-11-29 17:35:06

+0

@Robert:如果您需要将距离矩阵转换为坐标,并且您有统计工具箱,则可以使用例如`mdscale`,如`CityCoord = mdscale(distanceMatrix,2)';`。 – Jonas 2010-11-29 18:08:35

3

如果您还没有统计工具箱,等效形式由@Jonas提供的解决方案来计算欧几里得距离:

%# dist(u,v) = norm(u-v) = sqrt(sum((u-v).^2)) 
D = cell2mat(arrayfun(... 
    @(i) sqrt(sum(bsxfun(@minus, CityCoord, CityCoord(:,i)).^2)), ... 
    (1:size(CityCood,2))', ... 
    'UniformOutput',false)); 

否则,我们可以用事实||u-v||^2 = ||u||^2 + ||v||^2 - 2*u.v实现更快的量化代码:

X = sum(CityCoord.^2); 
D = real(sqrt(bsxfun(@plus,X,X')-2*(CityCoord'*CityCoord)));