MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

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[θ]}}






  • Prev by Date: Re: Non trivial substitution in a very long output
  • Next by Date: Re: Using Equal with Real Numbers
  • Previous by thread: Re: Matrices as operators
  • Next by thread: Re: Matrices as operators