Re: matrix of vectors - super slow
- To: mathgroup at smc.vnet.net
- Subject: [mg88050] Re: matrix of vectors - super slow
- From: dh <dh at metrohm.ch>
- Date: Wed, 23 Apr 2008 04:06:53 -0400 (EDT)
- References: <fukeuf$s67$1@smc.vnet.net>
Hi, here is a more mathematica like implementation.You should test it well, because I did not have the time to do it thoroughly. Is it correct that for Pint and SInt only one element of the 2x2 matrix is used? What is the Norm[..] doing? Further, there is no need to create 128^2 equal copies in BeamIn. I only give the changes, the definitions that are unchanged are eliminated: BeamIn={{Sqrt[2]/2},{Sqrt[2]/2}}; x=Table[R ((2 i-n)-1),{i,n}]; y=Table[R ((2 i-m)-1),{i,m}]; PBeam=Outer[(r=Sqrt[#1^2+#2^2]; \[Theta]=ArcTan[#2/#1]; PPol.LaserRod[r,\[Theta],1*10^-3].QuarterWave[\[Pi]/2].LaserRod[r,\[Theta],1*10^-3].PPol.BeamIn)&,x,y]; SBeam=Outer[(r=Sqrt[#1^2+#2^2]; \[Theta]=ArcTan[#2/#1]; SPol.LaserRod[r,\[Theta],1*10^-3].QuarterWave[\[Pi]/2].LaserRod[r,\[Theta],1*10^-3].PPol.BeamIn)&,x,y]; PInt=Map[Norm[#[[1,1]]]^2&,PBeam,{2}]; SInt=Map[Norm[#[[2,1]]]^2&,SBeam,{2}]; hope this helps, Daniel 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 >