I agree that "optimal" is a subjective concept - that was why I put it in quotes in my previous email. I wasn't thinking about performance when I used optimal though, (although that could also come in to it), I was talking more about how to most naturally express an algorithm.
For example, when I first was coming to grips with tacit (and trains in particular), I used to prefer to use ([: v2 v1) to represent applying v1 and then v2 to an argument. I think this was because it was easier for me to identify the distinct verbs that formed the train. But over time, as I became more comfortable with parsing trains, I began to find that v2@:v1 expressed more precisely and directly what I was trying to do, and it therefore made it a clearer representation for me of what the code was trying to accomplish. I know for me the main hurdle that I had to overcome was being able to easily identify adverbs and conjunctions and therefore the component verbs in a train. I tried to cover some of these issues in the Wiki guide http://www.jsoftware.com/jwiki/Guides/Defining%20Verbs On Thu, Aug 23, 2012 at 9:45 PM, Linda Alvord <[email protected]> wrote: > If you compare these two tacit versions for the creation of the matrix, I > think my version is optimal because it is "read" from right to left. I > don't care much if it or most any function is fast, as it always beats me in > completing whatever it is doing. > > Maybe someone will write an optimizer to turn my code into optimal code and > then the computer can speed along in the fast lane without ever explaining > it to me. > > It could do all the final comparisons and choosing of optimal timings. It > could do it on its own and just keep the results to itself. It, notice how I > have humanized it since it one of my best mathematical buddies, reads from > left to right and right to left with equal easy. However, most humans > probably don't it makes it difficult for us to communicate and become > readers of both styles. > > So.... how do you judge which of these two versions is optimal? > > Linda > > > -----Original Message-----ow > From: [email protected] > [mailto:[email protected]] On Behalf Of Ric Sherlock > Sent: Thursday, August 23, 2012 3:18 AM > To: [email protected] > Subject: Re: [Jprogramming] Creating random symmetric matrices > > Hi Linda, > Basically tacit definitions contain no reference to their arguments. > http://en.wikipedia.org/wiki/Tacit_programming > > By that definition the following assignment isn't tacit because the "y" > refers to the right argument. > > trian=: 13 :'-:y*>:y' > > However the resulting definition for trian is tacit: > > trian > [: -: ] * >: > > As Bill suggests, 13 : '' is a useful tool for understanding how to convert > explicit to tacit, but it won't necessarily generate "optimal" > tacit definitions. > > On Thu, Aug 23, 2012 at 3:29 PM, Linda Alvord <[email protected]> > wrote: >> If you are able to use 5!:4 and get a tree, is that a way to tell if >> the definition is tacit? >> >> Thanks for letting me know that I was not clear about tacit. >> >> Linda >> >> -----Original Message----- >> From: [email protected] >> [mailto:[email protected]] On Behalf Of Ric >> Sherlock >> Sent: Wednesday, August 22, 2012 9:36 PM >> To: [email protected] >> Subject: Re: [Jprogramming] Creating random symmetric matrices >> >> Just a pedantic nitpick with regard to terminology here. >> Ewart's verbs were already tacit. I think the key thing that your >> versions show is how that tacit translates to explicit and then how 13 >> : retranslates them to another tacit version without hooks. >> >> On Thu, Aug 23, 2012 at 12:45 PM, Linda Alvord >> <[email protected]> >> wrote: >>> Ewart's function in tacit version: >>> >>> trian=: 13 :'-:y*>:y' >>> indsy=: 13 :'(>.|:i.y)+/tri i.y' >>> >>> indsy 4 >>> 0 1 3 6 >>> 1 2 4 7 >>> 2 3 5 8 >>> 3 4 6 9 >>> trian >>> [: -: ] * >: >>> indsy >>> ([: >. [: |: i.) +/ [: tri i. >>> >>> Linda >>> >>> >>> -----Original Message----- >>> From: [email protected] >>> [mailto:[email protected]] On Behalf Of Henry >>> Rich >>> Sent: Wednesday, August 22, 2012 6:46 PM >>> To: [email protected] >>> Subject: Re: [Jprogramming] Creating random symmetric matrices >>> >>> Why yes, that's much better. Very clever way of filling the triangle. >>> >>> Henry Rich >>> >>> On 8/22/2012 4:28 PM, Ric Sherlock wrote: >>>> Note that Ewart Shaw has responded to this on the Wiki with a >>>> solution that only generates the required number of random numbers: >>>> http://www.jsoftware.com/jwiki/EwartShaw/RandomSymmetricMatrix >>>> >>>> On Wed, Aug 22, 2012 at 5:30 PM, Ric Sherlock <[email protected]> wrote: >>>>> The other option is not to add them in the first place? >>>>> >>>>> load 'stats/distribs' >>>>> (|: + ~: zeroTri ) >: zeroTri rnorm 5 5 >>>>> 0.346799 _1.22161 0.57274 0.556122 _0.329658 >>>>> _1.22161 0.149955 _1.77435 _1.76668 0.831557 >>>>> 0.57274 _1.77435 0.77674 _0.0690683 _0.967551 >>>>> 0.556122 _1.76668 _0.0690683 0.720588 _0.195658 >>>>> _0.329658 0.831557 _0.967551 _0.195658 _0.12314 >>>>> >>>>> In other words zero the items above the diagonal then transpose and >>>>> add to the non-diagonal items. >>>>> >>>>> Where zeroTri is an adverb defined as below: >>>>> >>>>> NB.*zeroTri a Zeros triangular items of matrix determined by verb >>>>> to >> left >>>>> NB. EG: < zeroTri mat NB. zeros lower-tri items of mat >>>>> NB. EG: <: zeroTri mat NB. zeros lower-tri, off-diag items of mat >>>>> NB. EG: > zeroTri mat NB. zeros upper tri items of mat >>>>> NB. EG: = zeroTri mat NB. zeros all off-diag items of mat >>>>> NB. EG: ~: zeroTri mat NB. zeros diag items of mat >>>>> zeroTri=: 1 :'([: u/~ i.@#) * ]' >>>>> >>>>> This is somewhat wasteful in that you generate a bunch of random >>>>> numbers that you then discard, but if that was an issue you could >>>>> work around it. >>>>> >>>>> >>>>> On Wed, Aug 22, 2012 at 5:07 PM, Owen Marschall >>>>> <[email protected]> wrote: >>>>>> You read my mind. I was thinking about this same problem tonight >>>>>> while >>> at the opera, and I couldn't think of any way to only divide the >>> diagonals by sqrt(2) a second time--without loops, of course. I don't >>> quite yet understand why your solution works, but I'm sure with >>> enough staring and dictionary help I'll get it. >>>>>> >>>>>> Thanks, >>>>>> Owen >>>>>> >>>>>> On Aug 21, 2012, at 8:25 PM, Henry Rich wrote: >>>>>> >>>>>>> If you have a matrix a of standard normal deviates, you can make >>>>>>> it symmetric with >>>>>>> >>>>>>> asymm =: (+ |:) a >>>>>>> >>>>>>> but what is the variance of the items of a? >>>>>>> >>>>>>> The variance of values off the principal diagonal will be the sum >>>>>>> of >>> the variance of two independent standard normal deviates. i.e. 2. >>>>>>> >>>>>>> To return these values to variance 1 you need to divide by sqrt(2). >>>>>>> >>>>>>> But the variance of values ON the principal diagonal will be the >>>>>>> sum of >>> two perfectly correlated random variables, i. e. 4. >>>>>>> >>>>>>> So you need to treat the principal diagonal differently. You can >>> reduce its variance by scaling it differently after the conversion to >>> symmetric, dividing the diagonal by sqrt(4) and the rest by sqrt(2): >>>>>>> >>>>>>> asymmgood =: asymm % %: +: >: e. i. # asymm >>>>>>> >>>>>>> (The e. i. bit is a standard idiom for making an identity matrix. >>> Another one you see around is = i. but I avoid that because I think >> monad >>> = was wrongly defined and should be assigned for other purposes) >>>>>>> >>>>>>> If I've made a statistical blunder I'm sure someone will tell me. >>>>>>> >>>>>>> Henry Rich >>>>>>> >>>>>>> On 8/21/2012 3:10 PM, Owen Marschall wrote: >>>>>>>> Ah, just what I needed. Thanks! >>>>>>>> >>>>>>>> On Aug 21, 2012, at 1:06 PM, Ric Sherlock wrote: >>>>>>>> >>>>>>>>> The primitive ( |: ) is transpose. E.g. : >>>>>>>>> >>>>>>>>> |: i. 3 4 >>>>>>>>> 0 4 8 >>>>>>>>> 1 5 9 >>>>>>>>> 2 6 10 >>>>>>>>> 3 7 11 >>>>>>>>> On Aug 22, 2012 6:55 AM, "Owen Marschall" >>>>>>>>> <[email protected]> >>> wrote: >>>>>>>>> >>>>>>>>>> Anyone know of an easy way to create a random symmetric matrix >>>>>>>>>> (more specifically, a matrix whose entires are each picked >>>>>>>>>> from a standard Gaussian distribution)? I can start by doing >>>>>>>>>> >>>>>>>>>> load 'stats' >>>>>>>>>> R=:normalrand N N >>>>>>>>>> >>>>>>>>>> but this is not symmetric, and I don't know of any way to >>>>>>>>>> symmetrize it without thinking in loops, which I'm training >>>>>>>>>> myself not to. If I could somehow take a transpose, that would >>>>>>>>>> solve the problem, but I don't know how to do that either. >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> Owen >>>>>>>>>> -------------------------------------------------------------- >>>>>>>>>> - >>>>>>>>>> - >>>>>>>>>> ------ 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 >>>> -------------------------------------------------------------------- >>>> - >>>> - 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 > ---------------------------------------------------------------------- > 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
