Here's another definition of rms

   Rms=: +/@:*: %:@% #
   Rms 1 2 1 2
1.58114

Explanation:

We do not need to square the numbers in the argument to #, we only
need to square them in the argument to +/

We only need the square root on the result of %

Makes sense?

Also, here's a partial explanation for the (+/%#)&.:*: definition of RMS

&.: means "under" much like &. except that the derived verb has
infinite rank - the verb on the left gets the entire array which
resulted from the verb on the right, regardless of the rank of the
verb on the right. In other words, it is equivalent to (+/ % #) &.
(*:"_)  In other words: square the numbers, add them up, divide by
their sum, then do the inverse of squaring on the result.

Thanks,

-- 
Raul


On Sun, Nov 17, 2013 at 12:43 AM, km <[email protected]> wrote:
> Focus on what you want to DO.  You want to do "the square root of the mean of 
> the square".
>
> A novice's tip for using  [:  is to read [: f g as "the f of the g" .  What 
> you want is
>
> [:  %:  (  [:  (+/%#)  *:  )
>
> which you read as "the square root of ( the mean of the square )" .  (Omitted 
> one "the".)
>
> Because of J's right-to-left processing you can omit the outer parentheses 
> and still read
>
> [:  %:  [:  (+/%#)  *:
>
> as "the square root of the mean of the square".
>
> Thus you can use
>
> rms  =:  [:  %:  [:  (+/%#)  *:
>
>
> Another tip is to read  @:  as "after".  You want to do square root after 
> doing mean after doing square.  Thus
>
> rms  =:  %:  @:  (+/%#)  @:  *:
>
> also works.  Pick what you are comfortable with and remember focus on what is 
> to be DONE.   J's verbs are DOERS.
>
>
> -- Kip Murray
>
> Sent from my iPad
>
>> On Nov 16, 2013, at 7:20 PM, Don Kelly <[email protected]> wrote:
>>
>> This is a novice problem  (which arose from reading  "Easy J" by Linda Alvort
>> I think that I have it worked out but this is something (IMHO) that possibly 
>> should be in a primer.
>> I have occasion to use what is called rms or root mean square (usually 
>> applied to a wave form).
>> I can define root, mean and square and can do something like:
>> root mean square 1 2 1 2
>> or
>>   %:(+/%#)*: 1 2 1 2                                   NB. in immediate 
>> execution
>> 1.58114                                 OK
>>
>> A natural tendency equivalent to saying mean=: +/%#
>> is to try
>> rms=: %:(+/%#)*:
>> But rms 1 2 1 2 fails.
>> However rms=: 3: ' %:(+/%#)*:y'  or rms=: 13: ' %:(+/%#)*:y'
>>  is OK
>> and the latter is equivalent to
>> rms=:[:%:[:(+/%#)*:  which works
>>
>> Alternatively  rms=:%:@:(+/%#)@:*:    also workS
>>
>> It is obvious that either the capped fork (from use of 13: or use of @: work 
>> and I see
>> the reasoning behind this- forcing a sequential " root after mean after 
>> square".
>>
>> Am I right in assuming that immediate execution of
>> %:(+/%#)*:   y where y is explicitly entered
>> is treated as 3:   or  13:   ' %:(+/%#)*::y '  (explicitly in that the *:y 
>> is the argument for mean(+/%#) whose value is the argument for %: i.e. as in 
>> APL for which 'tacit' doesn't exist)
>> and rms=: %:(+/%#)*:  as a tacit verb with no argument  is parsed as a  fork 
>> rather than sequentially as desired and runs into never never land?
>>
>> The classic example of 'mean=:+/%# as a verb is misleading in that the 
>> example is a single fork, but trying to extend it
>> does need a flag as to the need to emphasize the parsing.
>> (+/%#) *:  1 2 1 2 works but msg =:(+/%#)*: doesn't work but msg=:(+/%#)@:*: 
>>   or msg=:[:(+/%#)*: do work
>>
>>
>> Don Kelly
>>
>> --
>>
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to