Richard Kubina wrote:
> 
> Hi, first time poster, new J user.
> I cannot figure out how to do a certain sorta algorithm in J without a for
> loop.
> I have an array of data:
> a1=: 10 7 8 3 5
> 
> and the other to be calculated iteratively, except for the first value
> which
> is already known.
> a2=: 6
> 
> So I need to take the 6 and pair it with 10, do some calculations append
> the
> new number to the end of a2.
> I used this function to do this
> 
> GetEWMAData =: monad : 'for_x. }.SubGroupedData do. EWMAData=:EWMAData,
> (lambda*x)+((1-lambda)*({:EWMAData)) end.'
> 
> where lambda is 0.2, SubGroupedData is a1 here and EWMAData is a2, getting
> updated by appending the new number to the end of the list.
> Is there a way to do this without having the reassigning EWMAData itself
> with something appended to it, and using a for loop?
> Thanks!
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
> 
> 
Hi Richard,

That is an interesting problem. One solution is:

   creducel =: adverb : '([,{...@] x {:@[)~/@:|.@,'
   F =: adverb : '(m * [) + (1 - m) * ]'
   GetEWMADataA =: F creducel

   6 (0.2 GetEWMADataA) a1
6 6.8 6.84 7.072 6.2576 6.00608

If you're going for a one-liner, GetEWMADataA can be re-expressed as:

   GetEWMADataA1 =: adverb : '([ , {...@] ((x*[) + (1-x)*]) {:@[)~/@:|.@,'


Explanation:

Computation you're trying to describe is to collect all of 
the following values:
x
x f y1
(x f y1) f y2
...
(...((x f y1)f y2)...)f yn

where x is a1, yi are elements of a2 and f is the expression
from you post.

This can be modeled after reduce/fold function from functional 
languages, which is similar to and different from the Insert (/) of J.

Assuming that both arguments of f are of the same type, we 
can solve the problem by the following collect-reduce-from-left:

   creducel =: adverb : '([,{...@] x {:@[)~/@:|.@,'

   GetEWMAData =: f creducel

   f=:dyad : '(lambda * x) + y * 1-lambda'

   lambda =: 0.2
   6 GetEWMAData a1
6 6.8 6.84 7.072 6.2576 6.00608

   lambda =: 0.25
   6 GetEWMAData a1
6 7 7 7.25 6.1875 5.89062

   lambda =: 0.15
   6 GetEWMAData a1
6 6.6 6.66 6.861 6.28185 6.08957

Now, to get rid of the implicit dependence of f on the value
of lambda, we should define f as an adverb (Raul also suggested
this, but for some reason I couldn't get his solution to work):

   F =: adverb : '(m * [) + (1 - m) * ]'

F is like a function that generates f for a given value of lambda:

   0.25 F
(0.25 * [) + 0.75 * ]

Now we can do without explicit mention of lambda:

   GetEWMADataA =: F creducel

   6 (0.2 GetEWMADataA) a1
6 6.8 6.84 7.072 6.2576 6.00608

   6 (0.25 GetEWMADataA) a1
6 7 7 7.25 6.1875 5.89062

GetEWMADataA is an adverb that produces a verb solving
the problem for a given value of lambda:

   0.25 GetEWMADataA
([ , {...@] ((0.25 * [) + 0.75 * ]) {:@[)~/@:|.@,

We can also further simplify this by considering 
collect-reduce-from-right, which is slightly simpler to
define in J due to the J's assumed right-to-left order
of evaluation.

   Cheers,

        Viktor
-- 
View this message in context: 
http://old.nabble.com/Iterative-Updating-of-an-Array--tp26372897s24193p26376918.html
Sent from the J Programming mailing list archive at Nabble.com.

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to