help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

another vectorization challenge


From: Tim Rueth
Subject: another vectorization challenge
Date: Thu, 26 Aug 2010 18:36:57 -0700

For those of you who like to solve vectorization problems, I'm stuck on the following:
 
Let's say I have a vector with values that range from -10 to 10:
 
cpg_v = 20*rand(1,n) - 10;
 
Now, I want to create another vector cr_v of the same size with the following logic:
 
Whenever cpg_v drops below "cr_thd," then cr_v should get a 1.  Okay, that's easy:
 
cr_v = zeros(1,length(cpg));
cr_v (cpg_v < cr_thd) = 1;
 
I also want to know when cpg_v goes back above "rec_thd."  That's easy, too:
 
rec_v (cpg_v > rec_thd) = 1;
 
But here's the tricky part:  Reading cpg_v from 1:end, once a "1" is encountered at the corresponding location in cr_v, then cr_v should be assigned a "2" after that location (unless cpg_v drops below cr_thd again) until the point where cpg_v is greater than "rec_thd."  Note that a "2" shouldn't be assigned until there's a 1 in cr_v, and the run of 2's should stop once a 1 is encountered in rec_v.  Here's a simple example (with cr_thd = -4, rec_thd = 4), and the desired output:
 
    cpg_v        cr_v        rec_v    desired cr_v
-------------------------------------------------------------------
   6.45824   0.00000   1.00000   0.00000
   7.42197   0.00000   1.00000   0.00000
  -2.41237   0.00000   0.00000   0.00000
   4.85508   0.00000   1.00000   0.00000
   3.78177   0.00000   0.00000   0.00000
  -3.24793   0.00000   0.00000   0.00000
  -5.63435   1.00000   0.00000   1.00000
  -2.10278   0.00000   0.00000   2.00000
  -0.80376   0.00000   0.00000   2.00000
   7.97556   0.00000   1.00000   0.00000
  -5.11177   1.00000   0.00000   1.00000
  -4.56460   1.00000   0.00000   1.00000
  -8.43245   1.00000   0.00000   1.00000
   4.85563   0.00000   1.00000   0.00000
  -2.17610   0.00000   0.00000   0.00000
   4.87113   0.00000   1.00000   0.00000
   6.78267   0.00000   1.00000   0.00000
   9.30517   0.00000   1.00000   0.00000
   5.31377   0.00000   1.00000   0.00000
  -4.93238   1.00000   0.00000   1.00000
   2.10757   0.00000   0.00000   2.00000
   6.94569   0.00000   1.00000   0.00000
   1.67053   0.00000   0.00000   0.00000
  -7.23665   1.00000   0.00000   1.00000
  -5.43656   1.00000   0.00000   1.00000
  -9.79481   1.00000   0.00000   1.00000
   0.45726   0.00000   0.00000   2.00000
  -2.14684   0.00000   0.00000   1.00000
  -0.75054   0.00000   0.00000   1.00000
  -2.59986   0.00000   0.00000   1.00000
Obviously, this is easy to do in a for-loop, but is there a way to do it just with vectors?
 
Thanks,
 
--Tim

reply via email to

[Prev in Thread] Current Thread [Next in Thread]