绘制点之间的距离 matlab

Plot distances between points matlab

我画了10个点

10 10 248,628959661970 66,9462583977501 451,638770451973 939,398361884535 227,712826026548 18,1775336366957 804,449583613070 683,838613746355 986,104241895970 783,736480083219 29,9919502693899 534,137567882728 535,664190667238 885,359450931142 87,0772199008924 899,004898906140 990 990

以第一列为 x 坐标,另一列为 y 坐标

导致以下情节: 使用以下代码:scatter(Problem.Points(:,1),Problem.Points(:,2),'.b')

然后我还使用 Problem.DistanceMatrix = pdist(Problem.Points); Problem.DistanceMatrix = squareform(Problem.DistanceMatrix);

计算了欧氏距离

当距离大于某个值时,我将距离替换为1*10^6。 这导致以下 table:

然后,我想绘制相应点之间的线,最好是它们的距离,但前提是距离 < 1*10^6。

具体来说,我想绘制线 [1,2] [1,4] [1,7] [2,4] 等

我的问题是,这可以做到吗?如何做到?

假设您的一组数据在 xdata 中,另一组在 ydata 中,然后是 distances 中的距离,下面的代码应该可以完成您想要的。

hold on
for k = 1:length(xdata)
    for j = 1:length(ydata)
        if(distances(k,j) < 1e6)
            plot([xdata(k) xdata(j)], [ydata(k) ydata(j)]);
        end
    end
end

您只需遍历矩阵,然后如果值小于 1e6,则绘制第 k 个和第 j 个索引点之间的线。然而,这会使绘图线加倍,因此它会从 k 到 j 绘图,也会从 j 到 k 绘图,但编码速度快且易于理解。我得到了以下情节。

我的一个朋友建议使用 gplot

gplot(Problem.AdjM, Problem.Points(:,:), '-o')

以problem.points为坐标,Problem.AdjM为邻接矩阵。邻接矩阵是这样生成的:

Problem.AdjM=Problem.DistanceMatrix;
Problem.AdjM(Problem.AdjM==1000000)=0;
Problem.AdjM(Problem.AdjM>0)=1;

由于1*10^6的距离是替换过大的距离,所以我把那里的邻接设置为0,其他的都设置为1。

这导致了以下情节,这或多或少是我想要的:

既然你们一直在以如此美妙的方式帮助我,我只想补充一点:

我将 J. Mel 的解决方案添加到我的代码中,导致两个完全相同的数字:

既然数字是一样的,两种方法应该都可以。此外,由于之前 Tommasso 和 J Mel 的结果相同,因此 Tommasso 的代码也必须正确。

非常感谢你们和所有其他做出贡献的人!

这应该可以解决问题:

P = [
    10.0000000000000  10.0000000000000;
   248.6289596619700  66.9462583977501;
   451.6387704519730 939.3983618845350;
   227.7128260265480  18.1775336366957;
   804.4495836130700 683.8386137463550;
   986.1042418959700 783.7364800832190;
    29.9919502693899 534.1375678827280;
   535.6641906672380 885.3594509311420;
    87.0772199008924 899.0048989061400;
   990.0000000000000 990.0000000000000
];
P_len = size(P,1);

D = squareform(pdist(P));
D(D > 600) = 1e6;

scatter(P(:,1),P(:,2),'*b');

hold on;

for i = 1:P_len
    pi = P(i,:);

    for j = 1:P_len
        pj = P(j,:);
        d = D(i,j);

        if ((d > 0) && (d < 1e6))
            plot([pi(1) pj(1)],[pi(2) pj(2)],'-r');
        end
    end
end

hold off;

最终输出:

附带说明一下,可以通过以下方式避免将侵入某个阈值的距离值替换为 1e6 的部分(通过查看距离矩阵看起来它是 600)只需将该阈值插入循环中即可绘制线条。我的意思是...这并没有错,但我只是认为这是一个不必要的步骤。

D = squareform(pdist(P));

% ...

if ((d > 0) && (d < 600))
    plot([pi(1) pj(1)],[pi(2) pj(2)],'-r');
end