Cecil Jacob
Cecil Jacob

Reputation: 23

how to output all the iteration results from a FOR loop into matrix and plot the graph

I have two for loops in a nested format. My second loop calculates the final equation. The display of the result is outside the second loop in order to display when the second loop is complete.

Below is the logic I used in MATLAB. I need to plot graph of eqn2 vs x.

L=100
for x=1:10
    eqn1
       for y=1:L
          eqn2
       end 
       value = num2strn eqn2
       disp value
end

Currently the problem I am facing is that value or output of eqn2 is always replaced after each cycle until x reaches 10. Hence, the workspace table of eqn2 and value only shows the last value. My intention is to document all the output values of value in every cycle of x from 1:10.

How can I do this?

Upvotes: 2

Views: 11200

Answers (1)

Floris
Floris

Reputation: 46365

You pseudo-coded a little too strongly for my taste - I have tried to reconstruct what you were trying to do. If I understood correctly, this should do address your question (store intermediate results from the calculation in array Z):

L=100
z = zeros(L,10);
for x=1:10
   % perform some calculations
   eqn1
   for y=1:L
   % perform some more calculations; it is not clear whether the result of 
   % this loop over y=1:L yields one value, or L. I am going to assume L values
       z(y, x) = eqn2(x, y)
   end 

   value =num2strn eqn2

   disp value
end

% now you have the value of each evaluation of the innermost loop available. You can plot it as follows:

figure; 
plot( x, z); % multiple plots with a common x parameter; may need to use Z' (transpose)...
title 'this is my plot'; 
xlabel 'this is the x axis'; 
ylabel 'this is the y axis';

As for the other questions you asked in your comments, you could probably findd inspiration in the following:

L = 100;
nx = 20; ny = 99;  % I am choosing how many x and y values to test
Z = zeros(ny, nx); % allocate space for the results
x = linspace(0, 10, nx); % x and y don't need to be integers
y = linspace(1, L, ny);
myFlag = 0;              % flag can be used for breaking out of both loops

for xi = 1:nx            % xi and yi are integers
    for yi = 1:ny
         % evaluate "some function" of x(xi) and y(yi)
         % note that these are not constrained to be integers
         Z(yi, xi) = (x(xi)-4).^2 + 3*(y(yi)-5).^2+2;

         % the break condition you were asking for
         if Z(yi, xi) < 5
             fprintf(1, 'Z less than 5 with x=%.1f and y=%.1f\n', x(xi), y(yi));
             myFlag = 1; % set flag so we break out of both loops
             break
         end
    end
    if myFlag==1, break; end % break out of the outer loop as well
end

This may not be what you had in mind - I cannot understand "run the loop untill all the values of z(y,x) <5 and then it should output x". If you run the outer loop to completion (that's the only way you know "all the values of z(y,x)" then your value of x will be the last value it was... This is why I was suggesting running through all values of x and y, collecting the whole matrix Z, and then examining Z for the things you want.

For example, if you wonder if there is a value for X for which all Z < 5, you could do this (if you didn't break out of the for loops):

highestZ = max(Z, [], 1); % "take the highest value of Z in the 1 dimension
fprintf(1, 'Z is always < 5 for x = %d\n', x(highestZ<5));

etc.

If you can't figure it out from here, I give up...

Upvotes: 1

Related Questions