How to fill a vector and change its elements when reaching a specific element?

Hi all!
i want to fill a row vector X=1*3600 as x(j+1)=x(j)+20, and elements of X should be 0<=x<=1000.
for example :
x(1)=0
x(2)=20
x(3)=40,
.....
and when arriving x(j)=1000, x(j+1)=x(j)-20 as following :
x(j)=1000
x(j+1)=980
x(j+2)=960,
......
and when coming to "0" , it will start again x(j+1)=x(j)+20. i want to repeat that until arriving at the column 3600.
thanks in advance

 Accepted Answer

x = zeros(1, 3600);
x(1) = 0;
dx = 20;
for k=2:length(x)
xk = x(k-1) + dx;
if xk > 1000
dx = -20;
xk = x(k-1) + dx;
elseif xk < 0
dx = 20;
xk = x(k-1) + dx;
end
x(k) = xk;
end
plot(x,'o-')

3 Comments

@Bruno Luong Perfect! Thank you very much! this is the best solution that i want, many many thanks.
A variant, avoid repeating code
x = zeros(1, 3600);
x(1) = 0;
dx = 20;
k = 1;
while k < length(x)
xk = x(k) + dx;
if xk > 1000
dx = -20;
elseif xk < 0
dx = 20;
else
k = k+1;
x(k) = xk;
end
end

Sign in to comment.

More Answers (1)

Try this:
maxx = 1000;
x = zeros(1, 3600);
index = 2;
while x(index-1) < maxx && index < length(x)
x(index) = x(index-1) + 20;
index = index + 1;
end
for k = index : length(x)
x(k) = x(k-1) - 20;
% Quit if x goes negative
if x(k) < 0
break;
end
end
% Show in command window
x
x = 1×3600
0 20 40 60 80 100 120 140 160 180 200 220 240 260 280 300 320 340 360 380 400 420 440 460 480 500 520 540 560 580

4 Comments

@Image Analyst Hi! thank you for your reply! but the code you provided does not work for all the elements of x . i want to repeat the same for all the rest of vector.
it means when it comes to "0" , it will start again x(j+1)=x(j)+20. and when it reach 1000 i, it beomes x(j+1)=x(j)-20 until the end of x.
You did not say that originally that it should restart once it hit zero. But I'm sure you'll realize (or maybe not) that you just have to add another while and for until you get to the last, 3600th, element of x. Or you could wrap the for and a while in an outer while loop. If you really don't know how to copy the code and append it, let me know.
What's the use case for this anyway? Why not use sawtooth (in the Signal Processing Toolbox) instead? Why do you need to do it? If it's homework, then unfortunately you can't turn in my code as your own or you could get into trouble with your instructor.
@Image Analyst it is not a homework, just i'm asking for a simple way to don't repeat the while loop for many times. i posted my question not because i don't know how to write a code with loop but to find an easier manner .
i wrote that elements of x are between 0 and 1000 , i think that you understand that i want to fill all elements of x.
OK, looks like you're going to use Bruno's answer so I won't bother. You can increase your skills by investing 2 hours here:

Sign in to comment.

Asked:

on 17 Nov 2022

Commented:

on 17 Nov 2022

Community Treasure Hunt

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

Start Hunting!