0

我做了一个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。这导致下表:

欧几里得距离

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

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

我的问题是,这可以做到吗?怎么做?

4

3 回答 3

2

假设您的一组数据在一个叫做的东西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 绘制,但它可以快速编码并且易于理解。我得到了以下情节。

在此处输入图像描述

于 2018-02-12T20:55:10.117 回答
1

这应该可以解决问题:

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;

最终输出:

输出

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

D = squareform(pdist(P));

% ...

if ((d > 0) && (d < 600))
    plot([pi(1) pj(1)],[pi(2) pj(2)],'-r');
end
于 2018-02-12T21:03:58.417 回答
0

我的一个朋友建议使用 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 的解决方案,得到了两个完全相同的数字: 我的解决方案 J梅尔的解决方案

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

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

于 2018-02-12T20:55:44.437 回答