Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2011

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

Search the Archive

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



  • Prev by Date: Re: Using Equal with Real Numbers
  • Next by Date: Re: Forcing Certain Algebraic Forms With FullSimplify
  • Previous by thread: Re: Matrices as operators
  • Next by thread: Re: Matrices as operators