How do I properly append to an array within a loop?
Show older comments
I am running a loop of 300 iterations. Within the loop, I have a logic statement as follows.
for i = 1:300
if arrival <1
Ai = Ai + ia_time(i);
else
arrival = ia_time(i-1);
Ai = ia_time(i) + arrival;
end
disp(Ai); % <-- displays all values
end
disp(Ai); % <-- only displays the final value from the loop
While the loop is open, 'disp(Ai)' prints the values correctly. However, if I attempt to use or print the variable after the final closing 'end', I only get the one final value of Ai. What I would like is an array of all values that I can reuse for future operations later in the code. I feel like it is not creating the array properly, and perhaps I need to assign the value of Ai to another variable as the loop iterates, but I can't seem to make that work either.
I know this should be simple, but I am beating my newbie head on the desk.
Answers (2)
Guillaume
on 16 Oct 2017
If all you're trying to do is accumulate the values of ia_time, then
A = cumsum(ia_time);
If you really wanted to use a loop for that:
A = zeros(size(ia_time));
A(1) = ia_time(1);
for i = 2:numel(ia_time) %never hardcode end values, ask for what it actually is
A(i) = A(i-1) + ia_time(i);
end
You shouldn't name your variable Ai if i is meant to be the index. Assuming that A is already defined and that, at loop index i, you want to alter its component at position/index i:
A(i) = A(i) + ia_time(i) ;
which is: add element i of vector ia_time to element i of A, and store the result back in A at position i.
13 Comments
Loren Graf
on 16 Oct 2017
Edited: Loren Graf
on 16 Oct 2017
Guillaume
on 16 Oct 2017
The code in the question is puzzling on many levels.
First, the comment on this line:
disp(Ai); % <-- displays all 20 values
is misleading. It does not displays all 20 values. It displays the current value of Ai on the current step of the loop. At any point in the code, Ai only ever contains one value.
This is where it gets puzzling: It looks like you expected Ai (or maybe A) to be a vector of 20 values. In which case, as Cedric has answered, you should have used A(i) (or Ai(i) !) but then would have already created that variable with 20 values before the loop since you're intending to add to each of these elements within your loop. But if you had declared that variable as a vector, you wouldn't be saying that disp is ever showing the correct value...
In addition, assuming you meant A(i) then the line
A(i) = A(i) + ia_time(i)
only adds a value once to each element of A(i), and that value does not depend on previous iterations. The only way your faulty code could have displayed all 20 correct values would thus be if all A(i) values were 0, in which case the above line is pointless and:
A(i) = ia_time(i)
would be simpler.
Cedric
on 16 Oct 2017
Apparently Ai is not meant to be a vector (?) It would be simpler if you told us what you want to achieve, because we cannot easily guess it from the code.
Guillaume
on 16 Oct 2017
I've got a feeling that somewhere the code is meant to have a
A(i+1) = A(i) + ...
otherwise the loop makes absolutely no sense at all.
Cedric
on 16 Oct 2017
I would not bet against that feeling ;)
Loren Graf
on 16 Oct 2017
Edited: Loren Graf
on 16 Oct 2017
Cedric
on 16 Oct 2017
But what do you want to achieve? Is Ai meant to grow?
Loren Graf
on 16 Oct 2017
Edited: Loren Graf
on 16 Oct 2017
Is the following doing what you were trying to achieve?
ia_time = importdata('Data1.txt') ;
Ai = cumsum( is_time ) ;
If not, could you give e.g. the first 5 values of ia_time and the first 5 values of Ai as you would like them to be?
Loren Graf
on 16 Oct 2017
Well, as we've both shown it's so easy easy to do in matlab as well:
A = cumsum(ia_time);
Note that
if i-1 < 1
is needlessly complicated
if i < 2
or even simpler
if i == 1
Similarly, what is the point of + 0 ?
See my answer for the proper way to write it as a loop. But use cumsum
Looking at your PDF, those i mean "associated with the index". Try to precompute A, preallocate the others, initialize all, and loop the way Guillaume proposes:
ia_time = importdata('Data1.txt');
svc_time = importdata('Data2.txt');
A = cumsum( ia_time ) ;
T = zeros( size( A )) ;
WQ = zeros( size( A )) ;
D = zeros( size( A )) ;
T(1) = .. ?
WQ(1) = .. ?
D(1) = .. ?
for i = 2 : length( A )
T(i) = ... ?
WQ(i) = ... ?
D(i) = ... ?
end
Loren Graf
on 17 Oct 2017
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!