Re: addressing matrix elements
- To: mathgroup at smc.vnet.net
- Subject: [mg3587] Re: addressing matrix elements
- From: wagner at bullwinkle.cs.Colorado.EDU (Dave Wagner)
- Date: Wed, 27 Mar 1996 03:26:36 -0500
- Organization: University of Colorado, Boulder
- Sender: owner-wri-mathgroup at wolfram.com
In article <4itopk$v8 at dragonfly.wolfram.com>, David Cabana <drc at emi.net> wrote:
>
>More generally, I would like to be able to apply a function f to each
>element in a matrix of arbitrary size and dimensions, without worrying
>about the particulars of the matrix representation via lists. I want
>func[M, g] to return a matrix of the same size and shape as M, with
>elements formed by applying g to corresponding elements of M. Is there
>nice way to do this? Seems like some combination of Map, Apply, Thread,
>SetAttributes Listable, Outer, etc. could do the job, but I am lost in the
>morass of possibilites. Any help would be appreciated.
Whoa, you're trying way too hard. All you need to do is use Map with
a level specification. The level specification you want is TensorRank[m],
which gives the number of dimensions of the matrix. Here are some examples:
In[1]:=
m1 = Array[a, {2,3}]
Out[1]=
{{a[1, 1], a[1, 2], a[1, 3]},
{a[2, 1], a[2, 2], a[2, 3]}}
In[2]:=
Map[f, m1, {TensorRank[m1]}]
Out[2]=
{{f[a[1, 1]], f[a[1, 2]], f[a[1, 3]]},
{f[a[2, 1]], f[a[2, 2]], f[a[2, 3]]}}
In[3]:=
m2 = Array[b, {2,3,2}]
Out[3]=
{{{b[1, 1, 1], b[1, 1, 2]}, {b[1, 2, 1], b[1, 2, 2]},
{b[1, 3, 1], b[1, 3, 2]}}, {{b[2, 1, 1], b[2, 1, 2]},
{b[2, 2, 1], b[2, 2, 2]}, {b[2, 3, 1], b[2, 3, 2]}}}
In[4]:=
Map[f, m2, {TensorRank[m2]}]
Out[4]=
{{{f[b[1, 1, 1]], f[b[1, 1, 2]]}, {f[b[1, 2, 1]], f[b[1, 2, 2]]},
{f[b[1, 3, 1]], f[b[1, 3, 2]]}}, {{f[b[2, 1, 1]], f[b[2, 1, 2]]},
{f[b[2, 2, 1]], f[b[2, 2, 2]]}, {f[b[2, 3, 1]], f[b[2, 3, 2]]}}}
Note that my initial reaction was to use a level specification of {-1},
which means, "the lowest level". Unfortunately, that caused this to happen:
In[3]:=
Map[f, m1, {-1}]
Out[3]=
{{a[f[1], f[1]], a[f[1], f[2]], a[f[1], f[3]]},
{a[f[2], f[1]], a[f[2], f[2]], a[f[2], f[3]]}}
Using {-1} would work if your matrices were numeric, of course.
Dave Wagner
Principia Consulting
(303) 786-8371
dbwagner at princon.com
http://www.princon.com/princon
==== [MESSAGE SEPARATOR] ====