如何在矢量中的所有点之间绘制线条?

时间:2009-11-09 16:28:51

标签: matlab plot

我有一个包含二维空间中某些点的向量。我希望MATLAB用从每个点到每个其他点绘制的线来绘制这些点。基本上,我想要一个连接所有顶点的图形。你可以用情节做到这一点,如果有,怎么做?

2 个答案:

答案 0 :(得分:8)

一种解决方案是使用函数MESHGRID为每个点组合创建一组索引。然后,您可以使用函数LINE绘制每一行(它为每列数据绘制一行):

N = 10;                               %# Number of points
x = rand(1,N);                        %# A set of random x values
y = rand(1,N);                        %# A set of random y values
[I,J] = meshgrid(1:N);                %# Create all the combinations of indices
index = [I(:) J(:)].';               %'# Reshape the indices
line(x(index),y(index),'Color','k');  %# Plot the lines
hold on
plot(x,y,'r*');                       %# Plot the points

修改

您可能会注意到上述解决方案将为每个连接绘制一条线,这意味着它将绘制零长度连接点到自身的线,并为每个连接绘制2条线(即从点开始) A从B点到A点指向B 。这是另一个解决方案(使用函数HANKELFIND),它们不会绘制冗余或不必要的行:

N = 10;                               %# Number of points
x = rand(1,N);                        %# A set of random x values
y = rand(1,N);                        %# A set of random y values
[r,c,v] = find(hankel(2:N));          %# Create unique combinations of indices
index = [v c].';                     %'# Reshape the indices
line(x(index),y(index),'Color','k');  %# Plot the lines
hold on
plot(x,y,'r*');                       %# Plot the points

上述两种解决方案都创建了视觉上相同的图:

alt text

有关时间的说明......

出于好奇,我认为我应该使用HANKEL解决方案并将其与Amro's非常简洁的NCHOOSEK解决方案进行比较。对于N = 10,没有明显的差异。但是,当我将N增加到更大的值时,我开始看到NCHOOSEK解决方案开始非常慢:

  • N = 200

    >> tic; [r,c,v] = find(hankel(2:N)); index = [v c].'; toc; %'
    Elapsed time is 0.009747 seconds.
    
    >> tic; pairs = nchoosek(1:N,2).'; toc; %'
    Elapsed time is 0.063982 seconds.
    
  • N = 1000

    >> tic; [r,c,v] = find(hankel(2:N)); index = [v c].'; toc; %'
    Elapsed time is 0.175601 seconds.
    
    >> tic; pairs = nchoosek(1:N,2).'; toc; %'
    Elapsed time is 12.523955 seconds.
    

我有点惊讶,直到我查看了NCHOOSEK的代码(在MATLAB命令窗口中输入type nchoosek)。变量不仅在循环内生长而不是preallocated(正如Amro在注释中指出的那样),但所使用的算法也是递归,这意味着许多函数调用都是。我还注意到NCHOOSEK帮助文本末尾的这一行:

  

此语法仅适用于N小于约15的情况。

答案 1 :(得分:8)

基于gnovice的示例,生成所有对的更简单直观的方法是使用 nchoosek 函数:

%# random points
N = 10;
x = rand(1,N);
y = rand(1,N);

%# all possible combinations of the elements of [1:N] taken 2 at a time
pairs = nchoosek(1:N, 2)';

%'# plot points and lines
plot(x(pairs), y(pairs), '-bs', 'MarkerFaceColor','g', 'MarkerSize',10)

screenshot