MathGroup Archive 1997

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Sums vs Map efficiency

  • To: mathgroup at smc.vnet.net
  • Subject: [mg7753] Re: Sums vs Map efficiency
  • From: Stephen P Luttrell <luttrell at signal.dra.hmg.gb>
  • Date: Mon, 7 Jul 1997 04:41:24 -0400
  • Organization: Defence Research Agency
  • Sender: owner-wri-mathgroup at wolfram.com

> Does anyone know how to code the following
> in a tensor (more efficient than sums) form ?
> 
> here A1 is a (n,n,n)tensor and (A1,A2,a) are  n*n matrices
> 
> gm=Table[
>  Sum[ A1[[i,j,k]]*
>  A2[[i1,k1]]*
> a[[i,i1]]* a[[j,j1]]
> ,{i1,n},{j1,n},{i,n},{j,n}]
> ,{k,n},{k1,n}]//Flatten;
> 
> For some reason in that form it seems to take quite a long time to
> process gm. (here a is symbolic a= {{a11,a12...} ... ann}} )
> 
> What I am after is an expression involving Map and Thread and
> Transpose  ... ?

Try the following (where U is a vector of 1's):

((Transpose[a].(A1.U).(a.U))(A2.U)).U

This works step-by-step as follows:

1. (A1.U) evaluates Sum[A1[[i,j,k]],{k,n}]
2. (a.U) evaluates Sum[a[[j,j1]],{j1,n}]
3. (A1.U).(a.U) evaluates Sum[(1).(2),{j,n}]
4. (Transpose[a].(A1.U).(a.U) evaluates Sum[a[[i,i1]]*(3),{i,n}]
5. (A2.U) evaluates Sum[A2[[i1,k1]],{k1,n}]
6. (Transpose[a].(A1.U).(a.U))(A2.U) evaluates (4) (5)
7. ((Transpose[a].(A1.U).(a.U))(A2.U)).U evaluates Sum[(6),{i1,n}]

Here is the n=2 case in practice (I did this in Mathematica 3.0):

The input is:

n=2;
U=Table[1,{n}];
A1=Array[\[Alpha]1,{n,n,n}];
A2=Array[\[Alpha]2,{n,n}];
a=Array[\[Alpha],{n,n}];
((Transpose[a].(A1.U).(a.U))(A2.U)).U

which produces the following output:

((\[Alpha][1,1]+\[Alpha][1,2]) (
            \[Alpha][1,1] (\[Alpha]1[1,1,1]+\[Alpha]1[1,1,2])+
              \[Alpha][2,1] (\[Alpha]1[2,1,1]+\[Alpha]1[2,1,2]))+(
            \[Alpha][2,1]+\[Alpha][2,2]) (
            \[Alpha][1,1] (\[Alpha]1[1,2,1]+\[Alpha]1[1,2,2])+
              \[Alpha][2,1] (\[Alpha]1[2,2,1]+\[Alpha]1[2,2,2]))) (
      \[Alpha]2[1,1]+
        \[Alpha]2[1,
          2])+((\[Alpha][1,1]+\[Alpha][1,2]) (
            \[Alpha][1,2] (\[Alpha]1[1,1,1]+\[Alpha]1[1,1,2])+
              \[Alpha][2,2] (\[Alpha]1[2,1,1]+\[Alpha]1[2,1,2]))+(
            \[Alpha][2,1]+\[Alpha][2,2]) (
            \[Alpha][1,2] (\[Alpha]1[1,2,1]+\[Alpha]1[1,2,2])+
              \[Alpha][2,2] (\[Alpha]1[2,2,1]+\[Alpha]1[2,2,2]))) (
      \[Alpha]2[2,1]+\[Alpha]2[2,2])

If I wrap the last step in Timing it returns 0.01 second on my Pentium
90 PC.

========================================================================

Dr Stephen P Luttrell                  luttrell at signal.dra.hmg.gb
Adaptive Systems Theory                01684-894046 (phone)
Room EX21, Defence Research Agency     01684-894384 (fax)           
Malvern, Worcs, WR14 3PS, U.K.        
http://www.dra.hmg.gb/cis5pip/Welcome.html


  • Prev by Date: Bayesian: Markov chain Monte Carlo
  • Next by Date: Limits
  • Previous by thread: Sums vs Map efficiency
  • Next by thread: Re: What is wrong?