Re: matrix of vectors - super slow
- To: mathgroup at smc.vnet.net
- Subject: [mg88043] Re: matrix of vectors - super slow
- From: David Bailey <dave at Remove_Thisdbailey.co.uk>
- Date: Wed, 23 Apr 2008 04:05:36 -0400 (EDT)
- References: <fukeuf$s67$1@smc.vnet.net>
baaarnes at gmail.com wrote: > I have an matrix of vectors where each element has to go through > various transformations, that is each element has to be multiplied by > a few different matrices. Is there a more efficient way of doing that > from what I am currently doing? > > n = 128*1; > m = 128*1; > R = 1; > BeamIn = Table[( { > {Sqrt[2]/2}, > {Sqrt[2]/2} > } ), {i, n}, {j, m}]; > PBeam = Table[0, {i, n}, {j, m}]; > SBeam = Table[0, {i, n}, {j, m}]; > PInt = Table[0, {i, n}, {j, m}]; > SInt = Table[0, {i, n}, {j, m}]; > > HalfWave[\[Theta]_] = ( { > {Cos[-\[Theta]], Sin[-\[Theta]]}, > {-Sin[-\[Theta]], Cos[-\[Theta]]} > } ).( { > {1, 0}, > {0, Exp[-I \[Pi]]} > } ).( { > {Cos[\[Theta]], Sin[\[Theta]]}, > {-Sin[\[Theta]], Cos[\[Theta]]} > } ); > QuarterWave[\[Theta]_] = ( { > {Cos[-\[Theta]], Sin[-\[Theta]]}, > {-Sin[-\[Theta]], Cos[-\[Theta]]} > } ).( { > {1, 0}, > {0, Exp[-I \[Pi]/2]} > } ).( { > {Cos[\[Theta]], Sin[\[Theta]]}, > {-Sin[\[Theta]], Cos[\[Theta]]} > } ); > PPol = ( { > {1, 0}, > {0, 0} > } ); > SPol = ( { > {0, 0}, > {0, 1} > } ); > LaserRod[TT_, \[Theta]_, Q_] = ( { > {Cos[-\[Theta]], Sin[-\[Theta]]}, > {-Sin[-\[Theta]], Cos[-\[Theta]]} > } ).( { > {Exp[-I *2.8 *TT^2*Q], 0}, > {0, Exp[I *0.4 *TT^2* Q]} > } ).( { > {Cos[\[Theta]], Sin[\[Theta]]}, > {-Sin[\[Theta]], Cos[\[Theta]]} > } ); > > For[i = 1, i <= n, i++, > For[j = 1, j <= m, j++, > x = R ((2 i - n) - 1); > y = R ((2 j - m) - 1); > r = Sqrt[x^2 + y^2]; > \[Theta] = ArcTan[y/x]; > PBeam[[i, j]] = > PPol.LaserRod[r, \[Theta], 1*10^-3].QuarterWave[\[Pi]/ > 2].LaserRod[r, \[Theta], 1*10^-3].PPol.BeamIn[[i, j]]; > SBeam[[i, j]] = > SPol.LaserRod[r, \[Theta], 1*10^-3].QuarterWave[\[Pi]/ > 2].LaserRod[r, \[Theta], 1*10^-3].PPol.BeamIn[[i, j]]; > PInt[[i, j]] = Norm[PBeam[[i, j]][[1, 1]]]^2; > SInt[[i, j]] = Norm[SBeam[[i, j]][[2, 1]]]^2; > ]; > ]; > ListDensityPlot[PInt] > ListDensityPlot[SInt] > > Cheers > Make absolutely sure your matrices are composed of Real or Complex numbers by applying N[..] as necessary. Otherwise there is a danger of performing arithmetic on exact expressions composed of surds, fractions and factors of Pi. This can generate extremely complicated expressions which then collapse silently to real numbers as you plot them! David Bailey http://www.dbaileyconsultancy.co.uk