Using 'for loop' to plot

4 visualizaciones (últimos 30 días)
Grace
Grace el 2 de Dic. de 2022
Comentada: Grace el 8 de Dic. de 2022
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 comentarios
Walter Roberson
Walter Roberson el 2 de Dic. de 2022
Note that you can do things like
mask = x1 > 2 & x1 <10;
plot(x1(mask), y1(mask))
Grace
Grace el 3 de Dic. de 2022
Ok. noted.
Do you have some suggestion to help me with the 'for loop' to perform the operation in Method 2?

Iniciar sesión para comentar.

Respuesta aceptada

Karim
Karim el 3 de Dic. de 2022
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

Más respuestas (1)

Walter Roberson
Walter Roberson el 3 de Dic. de 2022
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')

Categorías

Más información sobre Programming en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by