ts '(1+4000-276) %~ > ((*/|.)@[ + ])&.> / (276 <\ i.4000),<0' 14.3879 1.03117e7
That is, not space-constrained for a reasonable PC. Since * is a well-behaved function all sorts of improvements should be possible. Unless the vector is short or you just need to do this once in which case you don't care. v=: 8 [EMAIL PROTECTED] 100 a=: (*/ |.) }: v b=: (*/ |.) }. v (1 _1}. a) -: _1 1 }. b 1 ----- Original Message ----- From: Roger Hui <[EMAIL PROTECTED]> Date: Wednesday, May 7, 2008 12:37 Subject: Re: [Jprogramming] Outer products problem To: Programming forum <[email protected]> > ts '276 calcAvgOP i.600' > 1.1417 1.35284e8 > ts '325 %~ > ((*/|.)@[ + ])&.> / (276 <\ i.600),<0' > 0.734065 2.25075e6 > > > > ----- Original Message ----- > From: Ronan Reilly <[EMAIL PROTECTED]> > Date: Wednesday, May 7, 2008 12:02 > Subject: [Jprogramming] Outer products problem > To: Programming forum <[email protected]> > > > I'm doing some analyses on EEG data and have run into a limit > > error for > > vectors of > 4000 elements. I'm wondering if there's any > > way around it. > > > > The code involves moving a fixed width window across a long > > vector of values > > one element at a time, computing the outer product of the > > (reversed) window > > of values with itself, and averaging over all the resulting > > matrices. I run > > into the limit error for vectors greater than 4000 elements > with > > a typical > > window size of 276 - yes, I was naive not to expect this :-) > > > > Here's the code that hits the limit: > > > > NB. x = window size ; y = vector of EEG values > > calcAvgOP =: [: (+/ % #) (*"0 1 |.)\ > > > > $M =: 276 calcAvgOP i. 4000 > > |limit error: calcAvgOP > > | M=:276 calcAvgOP i.4000 > > > > The problem is having to hold onto the millions of intervening > > matricesbefore averaging. I'd very much like to find a > > tacit solution to this > > problem and I was wondering if there's a formulation that can > > circumvent it. > > > > On the other hand, the rather inelegant explicit definition > > below works > > fine. > > > > NB. x = window size ; y = vector of EEG values > > calcAvgOP2 =: dyad define > > i =. 0 > > lim =. >: x -~ $y > > acc =. 0 $~ x,x > > while. i < lim do. > > acc =. acc + > (*"0 1 > > |.) x {. y > > y =. }. y > > i =. >: i > > end. > > acc % i > > ) > > > > $M =: 276 calcAvgOP2 i. 4000 > > 276 276 ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
