MathGroup Archive 2009

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

Search the Archive

Reposted, Reformatted Re: "mapping" functions over lists, again!

  • To: mathgroup at smc.vnet.net
  • Subject: [mg96287] Reposted, Reformatted Re: "mapping" functions over lists, again!
  • From: "Paul Ellsmore" <paul.ellsmore at nanion.co.uk>
  • Date: Wed, 11 Feb 2009 05:17:28 -0500 (EST)

This is a repost of an earlier post, as there were problems with the =
email
formatting for some people. I have composed this one in Notepad, and cut =
and
pasted to Outlook. Hope it works better.

Thanks to all who have already given me some advice, but I still haven't
quite got it yet!

 My data is in the form:

shortTestdata = {{{40., 28.06776 + 1.208548*I}, {43.094, 28.05721 +
1.298519*I}, {46.428, 28.05527 + 1.400228*I}, {50.019, 28.05509 +
1.508759*I},
    {53.888, 28.05729 + 1.624517*I}, {58.057, 28.05651 + 1.75026*I}}, =
{{40.,
7.42169 + 0.2198589*I}, {43.094, 7.408397 + 0.2343525*I},
    {46.428, 7.403769 + 0.2521353*I}, {50.019, 7.401313 + 0.2715986*I},
{53.888, 7.400478 + 0.2920617*I}, {58.057, 7.39994 + 0.3145005*I}},
   {{40., 1685.526 + 0.04809976*I}, {43.094, 1694.691 - 0.09133625*I},
{46.428, 1698.265 - 0.02731824*I}, {50.019, 1699.761 - 0.0491538*I},
    {53.888, 1700.523 - 0.2179222*I}, {58.057, 1701.162 - 0.2423136*I}},
{{40., 1808.702 - 0.006286621*I}, {43.094, 1808.524 - 0.1140757*I},
    {46.428, 1808.534 - 0.02445889*I}, {50.019, 1808.443 - 0.1061664*I},
{53.888, 1808.481 - 0.1762974*I}, {58.057, 1808.631 - 0.2894506*I}}}

This is a list of lists, the lowest level lists containing pairs of =
{real,
complex}. The individual lists are not all the same length, and the =
total
number of lists can vary, and I need to preserve the list structure.

I want to "map" functions across all the lists, to convert the data =
pairs to
{real, f(real,complex)}.

One suggestion was to use a Rule in Cases:

Cases[shortTestdata, {r_Real, c_Complex} :> {r, Re[c]}], but when =
applied to
the data above it Flattens my list structure:

In: realpart = Cases[shortTestdata, {r_Real, c_Complex} :> {r, Re[c]}, =
2]

Out: {{40., 28.06776}, {43.094, 28.05721}, {46.428, 28.05527}, {50.019,
28.05509}, {53.888, 28.05729}, {58.057, 28.05651}, {40., 7.42169}, =
{43.094,
7.408397},
  {46.428, 7.403769}, {50.019, 7.401313}, {53.888, 7.400478}, {58.057,
7.39994}, {40., 1685.526}, {43.094, 1694.691}, {46.428, 1698.265}, =
{50.019,
1699.761},
  {53.888, 1700.523}, {58.057, 1701.162}, {40., 1808.702}, {43.094,
1808.524}, {46.428, 1808.534}, {50.019, 1808.443}, {53.888, 1808.481},
{58.057, 1808.631}}

I can ressurect the list structure by checking the length of every list =
in
the data, and using these lengths in a Partition statement, but I'd =
rather
not lose the list structure in the first place. Is there a way to do =
that?

I am sure I could use Map in some way:

realpart=Map[fxn, shortTestdata,2]

but I have no real idea how to set up fxn to do what I want. I have =
tried:
In: Map[Cases[#_,{r_Real,c_Complex}->{r,Re[c]}&,shortTestdata,2] but I =
get a
list of empty lists out:
Out:{{},{},{},{}}

Another suggestion was to use First[#], Last[#], so:

In: realpart=Map[{First[#],Re[Last[#]]}&,shortTestdata,2] but this =
takes
first and last of the level 2 list:
Out: {{{40., 28.06776}, {58.057, 28.05651}}, {{40., 7.42169}, {58.057,
7.39994}}, {{40., 1685.526}, {58.057, 1701.162}}, {{40., 1808.702}, =
{58.057,
1808.631}}}

If I Map at level 3 I get an error message. Why doesn't this work? =
Surely at
Level 3, each element is a list of length 2, so First would be the real =
and
Last would be the complex?

My basic problem is that I don't know how to structure a fxn to be =
Mapped
over my lists, so that it applies different transformations to each =
element
of my data pairs.

So I think the most succinct way of expressing my problem is, what form =
does
fxn take if I want to Map it across my lists of {real,complex} so that =
it
returns {fxn1[real],fxn2[complex]} or even {real,fxn[complex]}?

Apologies if this is either a trivial question, or a nonsense question.
Ultimately, I think I can make Cases and Partition work for me, but I =
feel
sure there is a more elegant way, if only I understood the Mathematica
syntax better.

Thanks again,

Cheers,

Paul.



Dr. Paul A. Ellsmore
 
Nanion Limited
Oxford Centre for Innovation
Mill Street
Oxford
United Kingdom
OX2 0JX
 
Tel: +44 (0) 1865 811175
Fax: +44 (0) 1865 248594




  • Prev by Date: Re: Data interpolation
  • Next by Date: Re: Usage of #1
  • Previous by thread: Re: Shortest Path Problem
  • Next by thread: Re: Reposted, Reformatted Re: "mapping" functions over lists, again!