In http://jsoftware.com/pipermail/programming/2021-June/058315.html
Viktor Grigorov mentioned a need for a tensor product.

I have been trying to think of a good simple expression, but there's
special cases.

Still, I figured maybe someone might make use of this:

tip=: {{
  assert. 1=#,m
  select. m=. {.,m
    case. 0 do. */
NB.     case. 1 do. +/ .*
NB.     case. 2 do.
NB.       +/@(,/)@(*"2 _)
NB.     case. _ do.
NB.       +/@,@(*"_)
    case.   do.
      +/@(,/^:(m-1))@(*"(m,_))
  end.
}}

Example use:

   (i.2 3) 1 tip i.3 4
20 23 26 29
56 68 80 92
   (i.2 3) +/ .* i.3 4
20 23 26 29
56 68 80 92
   (i.2 3 5) 2 tip i.3 5 7
 7105  7210  7315  7420  7525  7630  7735
18130 18460 18790 19120 19450 19780 20110

Basically, the m argument to tip (tensor inner product) is the number
of pairs of dimensions in the argument arrays which should be summed
in the tensor product.

You can use _ if you want all dimensions to be paired.

The commented out lines in the definition could be removed or instated
(with the NB. toggled out) and that should make no difference in the
result, other than a slightly different intermediate representation of
the inner product.

As you can see in my above quicky examples, the m argument to tip is
the number of (inner) dimensions which must match between the two
array arguments. These dimensions vanish from the shape of the result.

I hope this makes sense to someone...

-- 
Raul
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to