Thanks - This is what I had concluded and Jasmin and Linda have also emphasized the [: rather than @: Both, in this case do what I wanted.

Don

On 16/11/2013 9:43 PM, km 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