MATLAB Answers

Nested For loops- Pleeease HELP!!

1 view (last 30 days)
pramit Sood
pramit Sood on 31 Mar 2015
Commented: pramit Sood on 31 Mar 2015
Hi! Hope you guys are doing great! :) Well this is a very trivial problem I am facing but I dont know I am totally stuck.. Can't figure out where the problem is!!
Well I have two arrays (or matrices) out_M and out_R (just attached the text files with this question.. I have simply written this code:
*for j=1:1:11
val = out_R(j,1);
for k=1:1:107
if out_M(k,1) == val
out_M(k,2) = out_M(k,2)-out_M(1,2);
end
end
end*
And I guess you must have noticed what I try to do.. I just want to take the first column value from out_R and then enter the out_M matrix. Then I just compare the first column value of out_M with the first column value of out_R. Till these values match, I just want to subtract a fixed number from the second column values of out_M.
Thats it!! All the counters are incrementing absolutely fine!! but the result only appears for 1 cycle not the 107 cycles.. :( its getting frustrating..
Please guide me as to what is wrong!
Thank you so much!
cheers
Pramit

  0 Comments

Sign in to comment.

Answers (3)

Titus Edelhofer
Titus Edelhofer on 31 Mar 2015
Hi Pramit,
if I take a look at out_M, then in the first entry you have zero. That's where you enter the "if" condition. All other values of out_M are different from all values of out_R, so you will never again enter into the if condition.
That said, I don't understand what you want to achieve, unfortunately, so I can't help more than the above. Try to formulate differently or in more detail.
Titus

  3 Comments

pramit Sood
pramit Sood on 31 Mar 2015
Aah really sorry Titus!
Well please find attached the corrected out_M matrix. That zero was a mistake.. Here's the code again:
for j=1:1:11 // Here I enter the out_R matrix and pick up first value at out_R(1,1) for instance
val = out_R(j,1); //here I store this first value in 'val' - for
instance - out_R(1,1) = 0
for k=1:1:107 /this is the nested for loop. I enter the out_M matrix.
if out_M(k,1) == val //compare the first column values of out_M
with 'val' - for instance '0'
out_M(k,2) = out_M(k,2)-out_M(1,2); // Till the first column
values are zero in
out_M, I want to do this
subtraction.
end
end
Hope now its a bit clearer.. Sorry to cause confusion..
Pramit end
Adam Wyatt
Adam Wyatt on 31 Mar 2015
Your problem still does not make sense - M(:, 1) is always zero, so the case statement will only occur for j=1, and for all M(:, 1).
The statement "// Till the first column values are zero in out_M, I want to do this subtraction" doesn't make sense (neglecting the incorrect comment symbol). Do you want to do the subtraction until M(k, 1)~=val and then move on to the next j? then use if out_M(k,1)~=val; continue; else; out_M(k, 2) = ...; end
pramit Sood
pramit Sood on 31 Mar 2015
Ya you are right!! It would only occur for j=1 but the if statement should do the subtraction atleast 107 times when first column of out_M is '0'. It is doing the subtraction only once... :(
Regards
Pramit

Sign in to comment.


Adam Wyatt
Adam Wyatt on 31 Mar 2015
  • Your code could easily be vectorized.
  • never use i or j for indexing because these are used for sqrt(-1) and can easily cause bugs. I would use nR and nM so that it is clear that these indices refer to the loop over the R position and M position.
  • You don't need to enter a step size of 1 (i.e. 1:11 is the same as 1:1:11)
Anyway, out_M(:, 1) always equals 0, so the contents of the case statement is not executed except when out_R==0 (i.e. the first j iteration). Also, M(1,2)==0, so that statement doesn't actually change any values!!
I would do the following (1 loop)
for nR=1:length(out_R)
	test = (out_M(:, 1) == out_R(nR));
	out_M(test, 2) = out_M(test, 2) - out_M(1, 2);
end

  1 Comment

pramit Sood
pramit Sood on 31 Mar 2015
Hi Adam! Thank you for your info notes.. :) Well the code also kind of works.. Thank you!! :)
But my original out_M matrix is what is attached here.. So as you see there are cycles of 0's, 1's ,2's and so on goes on uptil the end value of out_R that is 10.
Like I subtracted the first value of the second column i.e-out_M(1,2) from all the other values in out_M(:,2) for 0's cycle, I want to ask is it somehow possible if I can subtract the first value of 1's, 2's or 3's cycle from all the other values in the second column for that particular cycle..
I know it is confusing to explain.. for example- for 0's cycle - I subtract 55.752 for 1's cycle - I subtract 116.03 (from where the 1's cycle start) for 2's cycle - I subtract 176.294 (from where the 2's cycle start)
and so on..
I look forward to your suggestion..
Regards
Pramit

Sign in to comment.


Andrei Bobrov
Andrei Bobrov on 31 Mar 2015
ii = ismember(out_M(:,1),out_R);
out_M(ii,2) = out_M(ii,2) - out_M(1,2);
?

  0 Comments

Sign in to comment.

Sign in to answer this question.

Products


Translated by