darda
darda

Reputation: 4155

Plot lines between points in a matrix in MATLAB

I have a matrix with n rows and 4 columns. The columns are x0, y0, and x1, y1 (so basically I have n pairs of point coordinates in 2D). I want to draw a line between corresponding point pairs (that is, only between x0, y0 and x1, y1 of one row).

Is it possible to do it without a loop? Because the following works but is very slow.

for i = 1:size(A.data, 1)
    plot([A.data(i, 1), A.data(i, 3)], [A.data(i, 2), A.data(i, 4)], 'k-')
end

Upvotes: 1

Views: 10604

Answers (3)

darda
darda

Reputation: 4155

This works for the data structure I have:

data = [
        0, 0, 1, 0;...
        1, 0, 1, 1;...
        1, 1, 0, 1;...
        0, 1, 0, 0 ...
       ];

figure(1);
hold off;

%slow way
for i = 1:size(data, 1)
    plot([data(i, 1) data(i, 3)], [data(i, 2) data(i, 4)], 'r-');
    hold on;
end

%fast way ("vectorized")
    plot([data(:, 1)' data(:, 3)'], [data(:, 2)' data(:, 4)'], 'b-');
axis equal

This particular example draws a square.

The key is that MATLAB draws lines column-wise in the arguments. That is, if the arguments of plot have n columns, the line will have n-1 segments.

In a "connect-the-dots" scenario where all points in the vectors must be connected, this is irrelevant because MATLAB will transpose to get a column vector if it needs to. It becomes important in my application because I do not want to connect every point on the list - only pairs of points.

Upvotes: 1

PaulQ
PaulQ

Reputation: 308

I came here looking for the same answer. I basically want a horizontal line for each x,y point, starting with that point's x-y value, and ending at the x value of the next xy pair, without a line joining that segment to that of the next xy pair. I can make the segments by adding new points between, with the old y and the new x, but I didn't know how to break up the line segments. But your wording (matrix) gave me an idea. What if you load your xy pairs to a pair of x, y vectors and - wait for it - separate your pairs with nan's in both the x and y vectors. I tried that with a very long sine wave, and it seems to work. A ton of disjoint line segments, that plot and zoom instantly. :) See if it solves your problem.

% LinePairsTest.m
% Test fast plot and zoom of a bunch of lines between disjoint pairs of points 
% Solution: put pairs of x1,y1:x2,y2 into one x and one y vector, but with
% pairs separated by x and or y = nan.  Nan is wonderful, because it leaves
% your vector intact, but it doesn't plot.
close all; clear all;
n = 10000; % lotsa points
n = floor(n/3); % make an even set of pairs
n = n * 3 - 1;  % ends with a pair
x = 1:n; % we'll make a sine wave, interrupted to pairs of points.
% For other use, bring your pairs in to a pair of empty x and y vectors,
% padding between pairs with nan in x and y.
y = sin(x/3);
ix = find(0 == mod(x,3)); % index 3, 6, 9, etc. will get...
x(ix) = nan; % nan.
y(ix) = nan; % nan.
figure;
plot(x,y,'b'); % quick to plot, quick to zoom.
grid on;

Upvotes: 1

bogle
bogle

Reputation: 274

Try line for example

X=[1:10 ; 2*(1:10)];
Y=fliplr(X); 

line(X,Y)

Upvotes: -1

Related Questions