绘制点之间的距离 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
我画了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