Re: Matrices as operators
- To: mathgroup at smc.vnet.net
- Subject: [mg123201] Re: Matrices as operators
- From: Ray Koopman <koopman at sfu.ca>
- Date: Sat, 26 Nov 2011 05:08:04 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <jaal4e$12d$1@smc.vnet.net> <jafu4b$ro7$1@smc.vnet.net> <janol1$aqb$1@smc.vnet.net>
This is simpler. Does it do what you want? Note that 'mat' can be a ragged array. Mapping at {-1} preserves its shape, whatever it may be. In[1]:= op[mat_,t_] := Map[#@t&, mat, {-1}] In[2]:= op[ { {Sin, Cos}, Tan, whatever }, t ] Out[2]= { {Sin[t], Cos[t]}, Tan[t], whatever[t] } On Nov 25, 1:54 am, Chris Young <cy56 at comcast.net> wrote: > On 2011-11-22 10:39:07 +0000, Ray Koopman said: > >> If you're worried about redundant calculations when the matrices >> are bigger than 2 x 2 and the functions are more complicated than >> Sin and Cos, try something like >> >> R[t_] := {{#1,-#2},{#2,#1}}&[Cos@t,Sin@t] >> You could have the expression optimizer even further optimize that >> >> Experimental`OptimizeExpression[{{#1, -#2}, {#2, #1}} &[Cos@t, Sin@t]] >> >> (That is what happens in Compile) >> >> Oliver > > These look useful for speeding up calculations, and also clarifying the > structure of matrices. > > For what I was looking for though (applying a matrix of different > function names, such as "Sin" and "Cos", to the same parameter, such as > the angle theta) I think the following will work. > > I got unflatten[ ] from the Help for Partition (in the Applications section). > I was hoping that Partition alone would work, but reconstructing the > original array is more complicated than I thought. Not sure exactly > what Fold[ ] is doing here. Would like to try running this through the > debugger. > > At any rate, I think the op[ ] routine I made will apply any array > ("tensors", not just rectangular matrices) to a parameter as an > operator. > > Partition a flat list of elements into a multidimensional array with > specified dimensions. > (Take[{2, 3, 4, 5}, {-1, 2, -1} means take the elements from the last > through the second.) > > unflatten[ > list_, > {dims__?((IntegerQ[#] && Positive[#]) &)}] \ > := > Fold[ > Partition, list, Take[{dims}, {-1, 2, -1}] > ] \ > /; > (Length[list] === Times[dims]) > > This will apply matrix mat as an operator to the parameter =CE=B8 : > > op[mat_, =CE=B8_] := unflatten[ > Through[Flatten[mat][=CE=B8]], Dimensions[mat] > ] > > In[536]:= > > op[( { > {Cos, -Sin}, > {Sin, Cos} > } ), =CE=B8] > > Out[536]= > > {{Cos[=CE=B8], (-Sin)[=CE=B8]}, {Sin[=CE=B8], Cos[=CE=B8]}}