Re: Matrices as operators

*To*: mathgroup at smc.vnet.net*Subject*: [mg123158] Re: Matrices as operators*From*: Chris Young <cy56 at comcast.net>*Date*: Fri, 25 Nov 2011 04:53:47 -0500 (EST)*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com*References*: <jaal4e$12d$1@smc.vnet.net> <jafu4b$ro7$1@smc.vnet.net>

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 Î¸ : op[mat_, Î¸_] := unflatten[ Through[Flatten[mat][Î¸]], Dimensions[mat] ] In[536]:= op[( { {Cos, -Sin}, {Sin, Cos} } ), Î¸] Out[536]= {{Cos[Î¸], (-Sin)[Î¸]}, {Sin[Î¸], Cos[Î¸]}}