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