Repeating while loop to form matrix
Show older comments
I am simulating a random walk, I have a while loop that creates an array of the distance the particle is from the starting point for each iteration. I would like to then take this while loop and repeat it to simulate multiple particles at once, and then create a matrix that combined all the previous arrays. I am trying to repeat the while loop with a for loop. RIght now it only gives me back the matrix but with one row (when in this example it should have 3) and when I get multiple rows its all of the same array. ANy help would be appreciated
i = 10; %iteration time step
t = 0; %current time
p = 0; % current position
d = 0; %distance from orgin
A = zeros(1,i);%array of distances
B = [1:i];
p = 3 %number of particles
multiple_distance=[] %matrix of distances
for ii = 3
while t < i
r=rand;
if r<0.5
l=1;
else
l=-1;
end
x = x + l;
d = abs(0-x);
t = t+1;
A(t)=x;
end
A
multiple_distance = [multiple_distance ; A]
end
Answers (1)
Bob Thompson
on 4 Jun 2021
Edited: Bob Thompson
on 4 Jun 2021
You've only indexed one value (ii = 3 means it will only ever be 3), which is why you're only getting one line completed.
for ii = 1:3 % Loops through all values from 1 to 3
while t < i
r=rand;
if r<0.5
l=1;
else
l=-1;
end
x = x + l;
d = abs(0-x);
t = t+1;
A(t)=x;
end
A
multiple_distance = [multiple_distance ; A]
end
I'm pretty sure this can be done without loops at all, but I'm going to have to spend a bit more time figuring out what the code is doing before I can give you an answer on that.
4 Comments
Jo
on 4 Jun 2021
Bob Thompson
on 4 Jun 2021
Edited: Bob Thompson
on 4 Jun 2021
Oh, it's giving the same results because t is not being reset for each part of the for loop. So it runs the while loop the first iteration, and then finds that the conditions are closed (t~<i) so it skips the while loop for the second and third loops of the for, and just outputs the same A.
In any event, I was able to modify things to work without loops, so it should be faster to work on the entire matrix at once. This is assuming I actually understood what the loops are trying to accomplish.
i = 10; % Number of steps to take per particle
p = 3; % Number of particles
A = rand(p,i); % Get random numbers for all steps for all particles
A(A>=0.5) = -1; % Your previous l check
A(A<0.5&>0) = 1; % Else condition
multiple_distance = cumsum(A,2); % Sum steps across each row to get cumulative distance
Jo
on 4 Jun 2021
Bob Thompson
on 4 Jun 2021
I'm not sure I understand what you mean by 'regular' vs 'cumulative.' I gave cumulative values because you were previously tracking x, which was the cumulative of each step. If you just want to get the +/- for each step the A already has those.
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!