For larger arrays using ($,) with an empty shape will be much faster.
This is because ($,) has special code while ({.@,) doesn't. Of course,
the reason I used it in my original post was blind luck: I mistakenly
thought ({.@,) had special code but would give a domain error on empty
arguments.

   a =. i.1e3 1e3
   6!:2 '{.@, a'
0.002591
   6!:2 '($0) ($,) a'
1.7e_5
   6!:2 '($0) $, a'
0.003077

Marshall

On Thu, Nov 09, 2017 at 02:17:11PM -0500, Raul Miller wrote:
> This actually looks like a good idea.  I was concerned about
> performance, but this kind of thing also seems just as fast as the
> other approach, and a bit more compact:
> 
>    num=:(1 [ 0+{.@,) ::0:
>    numeric=: 0 = 0 {.@{. ,
>    1e4 timespacex 'numeric 3 4'
> 1.0472e_6 2176
>    1e4 timespacex 'num 3 4'
> 9.204e_7 1408
> 
> Plus, we don't have to worry about if sparse array default value will
> ever leak in, in some J version.
> 
> Thanks,
> 
> -- 
> Raul
> 
> On Thu, Nov 9, 2017 at 1:40 PM, Marshall Lochbaum <[email protected]> 
> wrote:
> > Actually, the domain error thing gives me an idea:
> >
> > numeric =: (1[[:+''($,)]) :: 0:
> >
> >    numeric i.3 5
> > 1
> >    numeric <2 3
> > 0
> >    numeric 'abcd'
> > 0
> >
> > Reshape to scalar, attempt to apply complex conjugate, and then return
> > 1. If conjugate failed, return 0. You could skip the reshape, yielding
> > ((1[+) :: 0:), but this gives a false positive on empty character arrays
> > and will actually compute the conjugate of a complex argument, which
> > could be slow.
> >
> > Marshall
> >
> > On Thu, Nov 09, 2017 at 01:01:40PM -0500, Raul Miller wrote:
> >> I would be inclined to do something similar:
> >>
> >> numeric=: 0  =  0 {.@{. ,
> >>
> >> That said, it's usually sufficient to rely on domain errors for this
> >> kind of thing.
> >>
> >> Thanks,
> >>
> >> --
> >> Raul
> >>
> >>
> >>
> >>
> >>
> >>
> >> On Thu, Nov 9, 2017 at 12:20 PM, Michael Berry <[email protected]> wrote:
> >> > Hello J world,
> >> >
> >> > I have a verb that returns scalar 1 if the argument is numeric of any 
> >> > shape
> >> > and scalar 0 otherwise.
> >> > It works fine:
> >> >
> >> >    numeric i. 5
> >> >
> >> > 1
> >> >
> >> >    numeric 9
> >> >
> >> > 1
> >> >
> >> >    numeric i. 2 3 4
> >> >
> >> > 1
> >> >
> >> >    numeric 'cat'
> >> >
> >> > 0
> >> >
> >> >    numeric 3#<i. 4
> >> >
> >> > 0
> >> >
> >> >
> >> > My definition feels clumsy, however. Can anyone suggest something nicer?
> >> >
> >> >
> >> > numeric=: monad : '0 -: 0{ , 1{. 0#y'
> >> >
> >> >
> >> > -Michael
> >> > ----------------------------------------------------------------------
> >> > 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
> ----------------------------------------------------------------------
> 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