Need help with a While loop

2 views (last 30 days)
Nicolo Zaza
Nicolo Zaza on 19 Jul 2012
So I'm trying to write a rainflow counting program and I'm having trouble with the repetitions
while i <= numel(PV) ;
i = i +1;
N = N+ 1;
PV(N);
switch N
case 3
X = abs(PV(N) - PV(N-1))
Y = abs(PV(N-1) - PV(N-2))
case 4
X = abs(PV(N) - PV(N-1))
Y = abs(PV(N-1) - PV(N-2))
end
end
Instead of doing cases all the way to 24 there must be an easier way but I suck at matlab and would appreciate any help. Thanks
  1 Comment
Nicolo Zaza
Nicolo Zaza on 19 Jul 2012
What Im actually trying to do is to re arrange a previous code to make work with some other scripts I developed but it is in fortran and I'm having a hard time translating it.
DIMENSION E(50)
N=0
1 N=N+1
CALL DATA(E(N),K)
IF(K == 1) STOP
2 IF(N < 3) GO TO 1
X=ABS((E(N)-E(N-1))
Y=ABS(E(N-1)-E(N-2))
3 IF(X.LT.Y) GO TO 1
4 RANGE=Y
XMEAN=(E(N-1)+E(N-2))/2
N=N-2
E(N)=E(N+2)
GO TO 2
END

Sign in to comment.

Accepted Answer

Kevin Claytor
Kevin Claytor on 19 Jul 2012
Edited: Kevin Claytor on 19 Jul 2012
You may want to have a look at this file to see how they implement the rainflow method; http://www.mathworks.com/matlabcentral/fileexchange/3026
Now I'm just going to take a stab at my interpretation and re-writing of your FORTRAN code (added matlab-style comments to the end);
DIMENSION E(50) % Not sure what this does; same as E=[1:50]?
N=0 % Initalize counters
1 N=N+1
CALL DATA(E(N),K) % K = DATA(E(N))
IF(K == 1) STOP % Throw an error if the first point is 1?
2 IF(N < 3) GO TO 1 % Can't do algorithm for N < 3, increment N
X=ABS((E(N)-E(N-1)) % Compute X and Y
Y=ABS(E(N-1)-E(N-2))
3 IF(X.LT.Y) GO TO 1 % Continue if X > Y - this is the 'flow part'
4 RANGE=Y % Set some other parameters
XMEAN=(E(N-1)+E(N-2))/2
N=N-2 % Go back to see if this is still max
E(N)=E(N+2) % Update counter with prev max at location N
GO TO 2
END
So to me, and I'm likely wrong, as I've never done rainflow counting before and just read the wiki page on it now in about 15 secs...
DATA = [...blargh...];
LDATA = length(DATA);
E = [1:LDATA]; % A linear index of where our flows start from?
N = 3; % no sense starting before the algorithm can kick in
while N < LDATA
X = abs(DATA(N) - DATA(N-1));
Y = abs(DATA(N-1) - DATA(N-2));
if x > Y
RANGE = Y;
XMEAN = (DATA(N-1) + DATA(N-2))/2;
E(N-2) = E(N);
N = N-2;
else
N = N+1;
end
end
Maybe this helps?
  1 Comment
Nicolo Zaza
Nicolo Zaza on 19 Jul 2012
This helped far more than what I was expecting.. Had to do some changes but it gave me a great idea.. Thanks a lot man.

Sign in to comment.

More Answers (4)

Walter Roberson
Walter Roberson on 19 Jul 2012
Why have a switch at all? Why not just
if N >= 3
X = abs(PV(N) - PV(N-1))
Y = abs(PV(N-1) - PV(N-2))
end
  2 Comments
Andrei Bobrov
Andrei Bobrov on 19 Jul 2012
if N >= 3 && N <= 4
X = abs(PV(N) - PV(N-1))
Y = abs(PV(N-1) - PV(N-2))
end
Albert Yam
Albert Yam on 19 Jul 2012
Following from Nicolo's response about keeping X,Y values.
for N = 3:length(PV)
if N >= 3 && N <= 4
X(N-2) = abs(PV(N) - PV(N-1))
Y(N-2) = abs(PV(N-1) - PV(N-2))
end
end
but at this point.. Walter is right .. why loop?
X = PV(3:end);
Y = PV(3:end);
X(1) = abs(PV(3) - PV(2));
X(2) = abs(PV(2) - PV(1));
Y(1) = abs(PV(3) - PV(2));
Y(2) = abs(PV(2) - PV(1));

Sign in to comment.


Matt Kindig
Matt Kindig on 19 Jul 2012
Edited: Matt Kindig on 19 Jul 2012
I reformatted the code for easier reading. A few questions:
  1. 1. what are X and Y for? They don't appear to be used anywhere in the loop, and are overwritten each time.
  2. 2. For N=3 or N=4, X and Y are defined in the same way.
  3. 3. Are i and N initialized prior to the loop?
  4. 4. What exactly is this code supposed to do? If we understand your intended output more clearly, we can probably recommend a more direct approach.
Your code:
while i <= numel(PV)
i = i +1;
N = N+ 1;
PV(N);
switch N
case 3
X = abs(PV(N) - PV(N-1))
Y = abs(PV(N-1) - PV(N-2))
case 4
X = abs(PV(N) - PV(N-1))
Y = abs(PV(N-1) - PV(N-2))
end
end
  1 Comment
Nicolo Zaza
Nicolo Zaza on 19 Jul 2012
Edited: Jan on 19 Jul 2012
This is just a part of the code Im trying to write, I actually have a fortran-like version of it if it would be of any help. The thing is that case 3 and 4 are not the only ones. What Im trying to do is for the loop to continue until theres no more values
PV = [ 80 -40 60 0 60 0 80 -100 60 20 60 20 80 -100 40 -80 0 -20 ...
0 -20 40 -80 80 -40];
SA = length(PV);
N = 0;
i = 1;
while i <= numel(PV) ;
i = i +1;
N = N+ 1;
PV(N);
switch N
case 3
X = abs(PV(N) - PV(N-1))
Y = abs(PV(N-1) - PV(N-2))
case 4
X = abs(PV(N) - PV(N-1))
Y = abs(PV(N-1) - PV(N-2))
end
end
This is what i have until now, The program is suppose to array the values from max to mins in a way defined by Rainflow Counting Algorithms(not sure if you've heard of it.) I could provide the fortran code if it would be of any help.
[EDITED, code formatted, Jan] Please learn how to format the code by your own: empty line above and below the code, mark code, hit "{} code" button or insert two spaces in front of each line manually. It is not so hard.

Sign in to comment.


Andrei Bobrov
Andrei Bobrov on 19 Jul 2012
Edited: Andrei Bobrov on 19 Jul 2012
switch N
case {3,4}
X = abs(PV(N) - PV(N-1));
Y = abs(PV(N-1) - PV(N-2));
end
OR
k = abs(diff(PV(1:4)));
xy = flipud(k(hankel(1:2,2:3)))
X = xy(1,N-2);
Y = xy(2,N-2);

Nicolo Zaza
Nicolo Zaza on 19 Jul 2012
Well yeah I already checked the Rainflow Method your sending me a link to but it doesn't seem to work properly. The problem I have is that I can't get it counting. I tried your code but it kept going and only displayed 1 answer for each element. It totally looks much better than mine. I need to get a bunch of X and Y's for 24 elements i should get around 12 of those(and for every other variable, ex: xmean) that's where I get lost. How can I keep it going and outputting results until there is an index with no info. And need all the results, like a vector. Also why cant an algorithm be done for {If N<3 , N = N + 1,end} something like that? Thanks
  1 Comment
Albert Yam
Albert Yam on 19 Jul 2012
The reason you only get 1 set of X, Y, is because you tell Matlab to over write it. This is the first instance of you mentioning that you need to keep previous X, Y values.
for N=1:length(PV)
if N<3
%stuff
end
end

Sign in to comment.

Categories

Find more on Startup and Shutdown in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!