在matlab点之间绘制距离

时间:2018-02-12 20:05:06

标签: matlab plot matlab-figure pdist

我制作了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') Plot

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

计算了欧氏距离

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

Euclidean distances

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

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

我的问题是,可以这样做吗?

3 个答案:

答案 0 :(得分: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进行绘图,但编码速度快且易于理解。我得到了以下情节。

enter image description here

答案 1 :(得分: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;

最终输出:

Output

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

D = squareform(pdist(P));

% ...

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

答案 2 :(得分:0)

我的一位朋友建议使用gplot

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

将problem.points作为坐标,将Problem.AdjM作为邻接矩阵。 Adjacency矩阵的生成如下:

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

由于1 * 10 ^ 6的距离代替了一个太大的距离,我将邻接区域设置为0,将所有其他区域设置为1。

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

Points Linked Together

既然你们一直以这么好的方式帮助我,我只想补充一下:

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

由于数字得出相同的结果,两种方法都应该是正确的。此外,由于Tommasso和J Mel的成绩较早,Tommasso的代码也必须正确。

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