No, you're not doing

r =. m +"(1 _) m

followed by

m <./ r

The <./ is applied on each result cell of m +"(1 _) m individually, and
those results are assembled into the final result.

Dissect doesn't look inside u .v, but you could try

   dissect '<./@(+"1 _)~ 2 2 $ 3 5 7 1'

Henry Rich

On 10/30/2014 9:25 AM, Jon Hough wrote:
> Unfortunately, even after reading the Nuvoc entry for . , I'm not sure I get 
> it.I was messing around with some usages:
> 
>    f =. <./ . +
> 
> 
> 
> 
>   m =: 2 2 $ 3 5 7 1
> 
> 
> f~ m
> 
> 
>   this gives
> 
> 
> 6 6
> 
> 
> 8 2
> 
> 
> Which seems odd. From Nuvoc, "x u . v y is defined for general u and v as x 
> u@(v"(1+lv,_)) y".
> 
> 
> So here I am doing  m +"(1 _) m
> 
> 
> and then from using the result of that, r say, doing
> 
> 
> m <./ r
> 
> 
> But the result of doing that is clearly not what is wanted.
> 
> 
> 
> 
> 
> 
> 
>> Date: Thu, 30 Oct 2014 06:58:31 -0400
>> From: [email protected]
>> To: [email protected]
>> Subject: Re: [Jprogramming] Algorithm to Check Graph is connected
>>
>> It looks like a hook because of the spacing and because .+ looks like a noun
>>
>> . is a conjunction, and returns a derived verb. As such there are two verbs
>> in the train, so a fork
>>
>> (<./ . +)
>> u . v
>>
>> uu=: </.
>> vv=: +
>>
>> (<. (uu . vv)) ~ (3 3 $ i.3)
>>
>>
>> running trace can be helpful:
>>
>>   trace '(<. <./ . +)~ arr'
>>   --------------- 3 Adverb -----
>>   <.
>>   /
>>   <./
>>   --------------- 4 Conj -------
>>   <./
>>    .
>>   +
>>   <./ .+
>>   --------------- 6 Bident -----
>>   <.
>>   <./ .+
>>   <. <./ .+
>>   --------------- 8 Paren ------
>>   (
>>   <. <./ .+
>>   )
>>   <. <./ .+
>>   --------------- 3 Adverb -----
>>   <. <./ .+
>>   ~
>>   (<. <./ .+)~
>>   --------------- 6 Bident -----
>>   (<. <./ .+)~
>>   arr
>>   (<. <./ .+)~ arr
>>   ==============================
>>
>>
>>
>>
>>
>>
>> On Thu, Oct 30, 2014 at 1:56 AM, Raul Miller <[email protected]> wrote:
>>
>>> It's a hook.
>>>
>>> The dot needs a space to its left to prevent it binding with the slash.
>>>
>>> (Insert slashdot joke, here.)
>>>
>>> Thanks,
>>>
>>> --
>>> Raul
>>>
>>>
>>> On Thu, Oct 30, 2014 at 1:49 AM, Jon Hough <[email protected]> wrote:
>>>> Is (<. <./ .+)〜 a fork? It looks like it should be a fork, but running
>>> dissect on it shows a hook.
>>>>
>>>>
>>>> --- Original Message ---
>>>>
>>>> From: "Henry Rich" <[email protected]>
>>>> Sent: October 30, 2014 11:02 AM
>>>> To: [email protected]
>>>> Subject: Re: [Jprogramming] Algorithm to Check Graph is connected
>>>>
>>>> Only one small tweak to this fine post:
>>>>
>>>>   > The rough J equivalent of C's array[i][j] = 30; would be
>>>>   >
>>>>   >     30 (<i,j)} array
>>>>
>>>> Precisely (Raul said 'rough', but the subtlety may be lost on
>>>> beginners), the equivalent would be
>>>>
>>>> array =: 30 (<i,j)} array
>>>>
>>>> 30 (<i,j)} array makes a whole new copy of array with element (i,j)
>>>> changed.  This can be expensive if the array is large.  By assigning to
>>>> the same name you save the cost of the new copy.
>>>>
>>>> Henry Rich
>>>>
>>>> On 10/29/2014 8:09 PM, Raul Miller wrote:
>>>>> The rough J equivalent of C's array[i][j] = 30; would be
>>>>>
>>>>>      30 (<i,j)} array
>>>>>
>>>>> For example:
>>>>>      30 (<2 3)} 6 6$0
>>>>> 0 0 0  0 0 0
>>>>> 0 0 0  0 0 0
>>>>> 0 0 0 30 0 0
>>>>> 0 0 0  0 0 0
>>>>> 0 0 0  0 0 0
>>>>> 0 0 0  0 0 0
>>>>>
>>>>> That said, be aware that often (not always, but often enough to be
>>>>> worth discussing the algorithm) J will offer better approaches.
>>>>>
>>>>> For example, for your connectedness problem:
>>>>> mat1 =: 5 5 $ _ 3 4 2 _, 3 _ _ 1 8, 4 _ _ 5 5, 2 1 5 _ _, _ 8 5 _ _
>>>>> mat2 =: 3 3 $ _ 1 _, 1 _ _, _ _ _
>>>>>
>>>>>      (<. <./ .+~)~^:# mat1
>>>>> 4 3 4 2  9
>>>>> 3 2 6 1  8
>>>>> 4 6 8 5  5
>>>>> 2 1 5 2  9
>>>>> 9 8 5 9 10
>>>>>      (<. <./ .+~)~^:# mat2
>>>>> 2 1 _
>>>>> 1 2 _
>>>>> _ _ _
>>>>>
>>>>> The expression (<. <./ .+)~^:_ finds the path distance between every
>>>>> pair of points in your distance matrix. If any of them are _ the
>>>>> matrix is not connected.
>>>>>
>>>>>      _ e.  , (<. <./ .+)~^:_ mat1
>>>>> 0
>>>>>      _ e.  , (<. <./ .+)~^:_ mat2
>>>>> 1
>>>>>
>>>>> The expression (<. <./ .+)~^:# is a slightly less efficient version of
>>>>> (<. <./ .+)~^:_
>>>>>
>>>>> The difference is that # specifies a repeat count equal to the number
>>>>> of rows in the matrix, while _ stops as soon as the result converges.
>>>>> To see why this matters, it can be instructive to look at some
>>>>> examples. You can see all the intermediate results (as well as initial
>>>>> and final values) by using a: instead:
>>>>>
>>>>>      (<. <./ .+~)~^:a: mat1
>>>>> _ 3 4 2  _
>>>>> 3 _ _ 1  8
>>>>> 4 _ _ 5  5
>>>>> 2 1 5 _  _
>>>>> _ 8 5 _  _
>>>>>
>>>>> 4 3 4 2  9
>>>>> 3 2 6 1  8
>>>>> 4 6 8 5  5
>>>>> 2 1 5 2  9
>>>>> 9 8 5 9 10
>>>>>
>>>>> and
>>>>>
>>>>>      (<. <./ .+~)~^:a: mat2
>>>>> _ 1 _
>>>>> 1 _ _
>>>>> _ _ _
>>>>>
>>>>> 2 1 _
>>>>> 1 2 _
>>>>> _ _ _
>>>>>
>>>>> The final result was achieved on the first iteration in both examples.
>>>>>
>>>>> So... how does that expression work?
>>>>>
>>>>> Structurally, it's doing something very like a transitive closure. See
>>>>> example 5 in the dictionary entry for ^:
>>>>>
>>>>> http://jsoftware.com/help/dictionary/d202n.htm
>>>>>
>>>>> Except, each iteration, it's adding every pair between two copies of
>>>>> the distance matrix and then for each endpoint pair finding the
>>>>> minimum distance which resulted. And, for sanity's sake, taking the
>>>>> minimum of that result and the original pair distance.
>>>>>
>>>>> The tricky part, if you have not seen it before, is the inner product:
>>>>>      u/ .v
>>>>>
>>>>> Matrix multiplication is +/ .* and we are following the same pattern
>>>>> here. Rather than try to document the details, however, I would prefer
>>>>> to point you at the dictionary
>>>>> http://jsoftware.com/help/dictionary/d202n.htm and the nuvoc page
>>>>> http://www.jsoftware.com/jwiki/Vocabulary/dot#dyadic
>>>>>
>>>>> (The other thing I am using is the u~ pattern. That's even simpler:
>>>>> u~y is equivalent to y u y. So, +~1 is equivalent to 1+1. Actually,
>>>>> it's so simple that it's worth explaining just because otherwise it's
>>>>> something your eyes might gloss over.)
>>>>>
>>>>> Anyways, unless you are working with connection matrices which stress
>>>>> the capacity of your machine, I imagine that finding all the path
>>>>> distances and checking if any are infinity will be faster than your
>>>>>
>>>>> connected =: verb define
>>>>>     mat=: y                NB. the graph (square matrix)
>>>>>     in=: 0         NB. list of connected nodes, start at node 0.
>>>>>     size=: # y     NB. Size of y
>>>>>     all=: i. size  NB. all nodes.
>>>>>     isconnected =: 0        NB. is connected flag.
>>>>>     counter =: 0
>>>>>     NB. loop through all nodes in graph.
>>>>>     NB. Add any nodes connected to the in list to the in list.
>>>>>     NB. If connected, in will eventually contain every node.
>>>>>     while. (counter < size) do.
>>>>>       counter=: counter + 1   NB. increment counter (very bad J?).
>>>>>       toin =: ''
>>>>>       NB. only want nodes that may not be connected. (remove "in" nodes)
>>>>>       for_j. all -. in  do.
>>>>>         NB. Get each column from in list and find non-infinite
>>>>>         NB. edges from these nodes to nodes in all - in list.
>>>>>         NB. (%) is to convert _ to 0.
>>>>>         if. ((+/@:%@:(j &{"2) @: (in& { "1) mat ) > 0) do.
>>>>>           toin =: toin ,  j
>>>>>         end.
>>>>>       end.
>>>>>       NB. append toin to in. Number of connected nodes increases.
>>>>>       in =: ~. in, toin
>>>>>       NB. check connectivity.
>>>>>       isconnected =:-. (# in ) < size
>>>>>       if. isconnected do.
>>>>>       end.
>>>>>     end.
>>>>>     isconnected
>>>>> )
>>>>>
>>>>> I hope this helps,
>>>>>
>>>> ----------------------------------------------------------------------
>>>> 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

Reply via email to