Using 'for loop' to plot

7 次查看(过去 30 天)
Grace
Grace 2022-12-2
评论: Grace 2022-12-8
I have three set of data (y1, y2 and y3). And I want to only plot a certain range within each data set.
I want to perform this task in two ways. I succedded in the first method to plot the graph without a 'for loop'.
But in the second method, I want to use a 'for loop'. However, I am a bit confused. Can you help me out. Thanks
clear all; close all;clc
x1=linspace(0, 11, 25);y1=2*x1.^2;
f1=max(find(x1<=2));f2=min(find(x1>=10));
x2=linspace(-2, 15, 17);y2=x2.^2;
f3=max(find(x2<=3));f4=min(find(x2>=14));
x3=linspace(-5, 25, 21);y3= (7.*x3)+ 5;
f5=max(find(x3<=5));f6=min(find(x3>=21));
%% Method 1
plot(x1(f1:f2),y1(f1:f2), 'r');hold on;plot(x2(f3:f4),y2(f3:f4), 'k');hold on;plot(x3(f5:f6),y3(f5:f6),'b')
xlabel('X');ylabel('Y')
return
%% Method 2
A=[y1 y2 y3];
B=[x1 x2 x3];
figure;
for i=1:length(A);
for j=1:length(B);
f1=max(find(x1<=2));f2=min(find(x1>=10));
f3=max(find(x2<=3));f4=min(find(x2>=14));
f5=max(find(x3<=5));f6=min(find(x3>=21));
plot(B(i),A(i))
hold on;
end
end
  2 个评论
Walter Roberson
Walter Roberson 2022-12-2
Note that you can do things like
mask = x1 > 2 & x1 <10;
plot(x1(mask), y1(mask))
Grace
Grace 2022-12-3
Ok. noted.
Do you have some suggestion to help me with the 'for loop' to perform the operation in Method 2?

请先登录,再进行评论。

采纳的回答

Karim
Karim 2022-12-3
It's not really clear why you would like to use a loop since the vectorized method is a lot cleaner from a code perspective. However, below you can see one method to use a for loop with the concatinated vectors A and B.
x1 = linspace(0, 11, 25);
y1 = 2*x1.^2;
i1 = x1 >=2 & x1 <= 10; % set up index for plot 1
x2 = linspace(-2, 15, 17);
y2 = x2.^2;
i2 = x2 >=3 & x2 <= 14;
x3 = linspace(-5, 25, 21);
y3 = (7.*x3)+ 5;
i3 = x3 >=5 & x3 <= 21;
%% Method 1 - vectorized
figure
hold on
plot(x1(i1), y1(i1), 'r')
plot(x2(i2), y2(i2), 'k')
plot(x3(i3), y3(i3), 'b')
hold off
xlabel('X')
ylabel('Y')
title("Method 1 - vectorized")
grid on
%% Method 2 - using a loop
A = [y1 y2 y3];
B = [x1 x2 x3];
figure
hold on
for i = 1:length(A)
if i <= length(x1)
% we are using the values for x1 y1
minVal = 2;
maxVal = 10;
colVal = 'r';
elseif i <= (length(x1)+length(x2))
% we are using the values for x2 y2
minVal = 3;
maxVal = 14;
colVal = 'k';
else
% we are using the values for x3 y3
minVal = 5;
maxVal = 21;
colVal = 'b';
end
if B(i) >= minVal & B(i) <= maxVal
scatter(B(i),A(i),colVal,'filled')
end
end
hold off
xlabel('X')
ylabel('Y')
title("Method 2 - in a loop")
grid on

更多回答(1 个)

Walter Roberson
Walter Roberson 2022-12-3
Of course you can do it with a loop.
I am not clear as to why you are constructing an x range that is not just the inside of the range that you are masking off, but whatever...
xlow = [0, -2, -5];
xhigh = [11, 15, 25];
masklow = [2, 3, 5];
maskhigh = [10, 14, 21];
colors = {'r', 'k', 'b'};
polycoeffs = [2 0 0; 1 0 0; 0 7 5];
for K = 1 : length(xlow)
x = linspace(xlow(K), xhigh(K));
y = polyval(polycoeffs(K,:), x);
mask = masklow(K) < x & x < maskhigh(K);
plot(x(mask), y(mask), colors{K});
hold on
end
hold off
xlabel('X');
ylabel('Y')

类别

Help CenterFile Exchange 中查找有关 Programming 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by