[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: tensor multiplication

Daniel Luebbert wrote:
> Hi,
> does anybody out there know an efficient and elegant way (i.e., without
> for-loops)
> to implement a tensor multiplication in IDL?
> What I mean is this:
> IDL can do a matrix multiplication, e.g. if I do
>         c = indgen(3,4)
>         d = indgen(4)
> then for
>         help, c#d
> I get
>         LONG ARRAY[3],
> and that's what I expect.
> But now, when I take one more dimension, like
>         c = indgen(2,3,4)
>         d = indgen(4)
> then
>         help, c#d
> gives an error! (incompatible matrix dimensions...).
> What a would like to get is obviously an
>         ARRAY[2,3]
> Does anybody know how?

Great question! I have always only thought about 2D matrices, but why
should nD be any different? Maybe when IDL says "matrix" is really means
2-D array?

how about

sz = size(c)
e = INTARR( sz(1), sz(2) )
FOR i = 0, sz(1) - 1 DO BEGIN
  tmp_e  = REFORM( c[i,*,*] ) # d
  e[i,*] = TEMPORARY( tmp_e )

I know it is not a great solution (I haven't tested it, just typed it)
but something like this should work. If you encapsulate it in it's own
function, you would have a general tensor mult. method.

I'm sure the Gumley's, Fanning's, Markwardt's, and JD Smith's of the
world will have more elegant answers.


p.s. Can someone explain to me the utility/need for having both the #
*and* ## operator? I understand their operation but why both?
Convenience? Performance? 
Paul van Delst           Ph:  (301) 763-8000 x7274 
CIMSS @ NOAA/NCEP        Fax: (301) 763-8545
Rm.202, 5200 Auth Rd.    Email: pvandelst@ncep.noaa.gov
Camp Springs MD 20746