English 中文(简体)
How do I plot lines between all points in a vector?
原标题:
  • 时间:2009-11-09 16:28:50
  •  标签:
  • matlab
  • plot

I have a vector containing some points in 2-D space. I want MATLAB to plot these points with lines drawn from every point to every other point. Basically, I want a graph with all vertices connected. Can you do that with plot and if so, how?

最佳回答

One solution is to create a set of indices for every combination of points using the function MESHGRID. You can then plot each line using the function LINE (which plots one line per column of data it s given):

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

EDIT:

You may notice that the above solution will plot a line for every connection, meaning that it will plot lines of zero length connecting points to themselves and will plot 2 lines for every connection (i.e. from point A to point B and from point B to point A). Here s another solution (using the functions HANKEL and FIND) that won t plot the redundant or unnecessary lines:

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

Both of the above solutions create visually identical plots:

alt text

A note on timing...

Out of curiosity, I thought I d time my HANKEL solution and compare it with Amro s very terse NCHOOSEK solution. For N = 10, there was no appreciable difference. However, as I increased N to much larger values I began to see the NCHOOSEK solution start to become very slow:

  • 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.
    

I was kind of surprised, until I looked at the code for NCHOOSEK (by typing type nchoosek in the MATLAB command window). Not only is a variable being grown inside a loop instead of being preallocated (as Amro pointed out in a comment), but the algorithm used is also recursive, meaning that many function calls are made. I also noticed this line at the end of the help text for NCHOOSEK:

This syntax is only practical for situations where N is less than about 15.

问题回答

Building on gnovice s example, a simpler more intuitive way of generating all pairs is using the nchoosek function:

%# 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





相关问题
MATLAB Solving equations problem

I want to solve these equations using MATLAB and I am sure there is a non zero solution. The equations are: 0.7071*x + 0.7071*z = x -0.5*x + 0.7071*y + 0.5*z = y -0.5*x - 0.7071*y +...

Difference between MATLAB s matrix notations

How do you read the following MATLAB codes? #1 K>> [p,d]=eig(A) // Not sure about the syntax. p = 0.5257 -0.8507 -0.8507 -0.5257 d = ...

preventing data from being freed when vector goes out of scope

Is there a way to transfer ownership of the data contained in a std::vector (pointed to by, say T*data) into another construct, preventing having "data" become a dangling pointer after the vector goes ...

Divide two polynomials using MATLAB

I want to divide p(x) by q(x) given that: p(x)=-5x^4+3x^2-6x q(x)=x^2+1 I tried: p=inline( -5*(x^4)+3*(x^2) , x ) p = Inline function: p(x) = -5*(x^4)+3*(x^2) q=inline( x^2+1 , x ) q = ...

matlab deals with Fibbonacci

The Fibonacci series is given as follows: 1, 2, 3, 5, 8, 13, 21, ... How can I write a script which calculates and prints the n-th Fibonacci term (for n>2), where n is inputed by the user. This ...

How do I plot lines between all points in a vector?

I have a vector containing some points in 2-D space. I want MATLAB to plot these points with lines drawn from every point to every other point. Basically, I want a graph with all vertices connected. ...

How do I create a string using a loop variable in MATLAB?

I have a loop like this: for i=1:no %some calculations fid = fopen( c:\out.txt , wt ); %write something to the file fclose(fid); end I want data to be written to different files like ...

热门标签