2013-03-25 4 views
1

У меня есть матрица с n строками и 4 столбцами. Столбцы представляют собой x0, y0 и x1, y1 (так что в основном я имею n пар точечных координат в 2D). Я хочу нарисовать линию между соответствующими точками (т. Е. Только между x0, y0 и x1, y1 одной строки).Строки между точками в матрице в MATLAB

Можно ли это сделать без петли? Потому что следующее работает, но очень медленно.

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 

ответ

1

Это работает для структуры данных у меня есть:

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 

Этот конкретный пример рисует квадрат.

Ключ в том, что MATLAB рисует строки по столбцам в аргументах. То есть, если аргументы plot имеют n столбцов, линия будет иметь n -1 сегменты.

В сценарии «connect-the-dot», где все точки в векторах должны быть связаны, это не имеет значения, потому что MATLAB будет транспонировать, чтобы получить вектор-столбец, если ему нужно. Это становится важным в моем приложении, потому что я делаю не хочу подключить каждую точку в списке - только пары точек.

-1

Попробуйте line, например

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

line(X,Y) 
+0

Я не вижу, как это соответствует моей структуре данных. – pelesl

+0

Ну, это просто показать использование. Линия векторизована и выводит строки в 2D без цикла for, что, как я думал, вы просили. Просто создайте 2 матрицы из столбцов ваших данных. X от 1-го и 3-го, Y от 2-го и 4-го. транспонируйте оба и вводите в линию. используйте дескриптор графика, если вы хотите манипулировать тем, как он отображается. – bogle

+0

ОК, затем отредактируйте свой ответ; потому что использование может быть легко проверено с помощью документов. Мой вопрос был «как рисовать линии между соответствующими парами без цикла», а не «как рисовать линию». FYI «линия» может быть заменена «графиком» в вашем решении, что приятно. Тем не менее, обе версии довольно медленные и приводят к графикам, которые медленно реагируют (масштабирование и т. Д.). (Я имею дело с 1500 парами очков, я бы ожидал лучшего.) – pelesl

1

Я пришел сюда в поисках тот же ответ. Я в основном хочу горизонтальную линию для каждой точки x, y, начиная с значения x-y этой точки и заканчивая значением x следующей пары xy, без линии, соединяющей этот сегмент с той, что следующая xy-пара. Я могу сделать сегменты, добавив новые точки между старыми y и новыми x, но я не знал, как разбить сегменты линии. Но ваша формулировка (матрица) дала мне представление. Что делать, если вы загружаете xy пары в пару векторов x, y и - ждите их - отделяйте свои пары от нана в векторах x и y. Я пробовал это с очень длинной синусоидой, и, похоже, это работает. Тонна сегментов непересекающихся линий, которые замышляют и масштабируют мгновенно. :) Посмотрите, решит ли он вашу проблему.

% 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; 
Смежные вопросы