Mathematica 9 is now available
Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2006
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2006

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

Search the Archive

Re: Pure function in a pure function (again)

  • To: mathgroup at smc.vnet.net
  • Subject: [mg69817] Re: Pure function in a pure function (again)
  • From: dimmechan at yahoo.com
  • Date: Sat, 23 Sep 2006 23:45:17 -0400 (EDT)
  • References: <ef2tl4$mn4$1@smc.vnet.net>

Hello.

(For clarity I have converted everything to InputForm.)

Remove["Global`"]

I read enough time your post/question and as far as I have understood
your pure function f is icorect.
"If Dat is a 2D-table, the following picks out the rows whose first
element is 1,2 or 3 and adds up their the second elements".
Are you sure that f do that?

dat = Array[2*#1 + #2 & , {3, 3}, {0, 1}]
{{1, 2, 3}, {3, 4, 5}, {5, 6, 7}}

f[x_] := Plus @@ Column[Select[dat, #1[[1]] == x & ], 2]

f /@ Range[3]
{{{3, 4, 5}}, {}, {{5, 6, 7}}}

If I guess right your desired result it should be
{{1+2,2+2,3+2},{3+4,4+4,5+4}}--->{{3,4,5},{7,8,9}}.
BTW, even if I am wrong about what I have understood, I believe that
the empty list in your result {{{3, 4, 5}}, {}, {{5, 6, 7}}}
is not welcome (at least for me...).

You can see what f does executing the following commands:

Trace[f /@ Range[3], Select]
{{{{HoldForm[Select[{{1, 2, 3}, {3, 4, 5}, {5, 6, 7}}, #1[[1]] == 1 &
]], HoldForm[{{1, 2, 3}}]}}},
  {{{HoldForm[Select[{{1, 2, 3}, {3, 4, 5}, {5, 6, 7}}, #1[[1]] == 2 &
]], HoldForm[{}]}}},
  {{{HoldForm[Select[{{1, 2, 3}, {3, 4, 5}, {5, 6, 7}}, #1[[1]] == 3 &
]], HoldForm[{{3, 4, 5}}]}}}}

f correctly collect the sublists in which the first element is 1 or 2
or 3.

Trace[f /@ Range[3], Plus]
{{HoldForm[{{1, 2, 3}} + 2], HoldForm[2 + {{1, 2, 3}}], HoldForm[{2 +
{1, 2, 3}}],
   {HoldForm[2 + {1, 2, 3}], HoldForm[{2 + 1, 2 + 2, 2 + 3}],
{HoldForm[2 + 1], HoldForm[3]}, {HoldForm[2 + 2], HoldForm[4]},
    {HoldForm[2 + 3], HoldForm[5]}}}, {HoldForm[{} + 2], HoldForm[2 +
{}], HoldForm[{}]},
  {HoldForm[{{3, 4, 5}} + 2], HoldForm[2 + {{3, 4, 5}}], HoldForm[{2 +
{3, 4, 5}}],
   {HoldForm[2 + {3, 4, 5}], HoldForm[{2 + 3, 2 + 4, 2 + 5}],
{HoldForm[2 + 3], HoldForm[5]}, {HoldForm[2 + 4], HoldForm[6]},
    {HoldForm[2 + 5], HoldForm[7]}}}}

But instead of the second element of EACH sublist, it actually adds up
the second element of the FIRST sublist (in particular 2 here).

So here is my attempt. It succeds as you can see (supposing I have
understood right!!!).

Before defining the pure function let me show you step by step the
procedure.

dat = Array[2*#1 + #2 & , {3, 3}, {0, 1}]
{{1, 2, 3}, {3, 4, 5}, {5, 6, 7}}

You want an output {{1,2,3},{3,4,5}}. This can be achieve by Cases and
Alternatives

Alias["|"]
Alternatives

Cases[dat, {1, ___} | {2, ___} | {3, ___}]
{{1, 2, 3}, {3, 4, 5}}

Of course it is supposed to do programming and not to type by hands. So

Alternatives @@ ({#1, ___} & ) /@ Range[3]
{1, ___} | {2, ___} | {3, ___}

lst=Cases[dat, Alternatives @@ ({#1, ___} & ) /@ Range[3]]
{{1, 2, 3}, {3, 4, 5}}

Now we make the difficult step (at least for me...), it comes the easy

(#1[[2]] + #1 & ) /@ lst
{{3, 4, 5}, {7, 8, 9}}

As you see the unwelcome {} is not there but what is more important is
that the result is what (I consider) the desired.

It is time to collect the pieces. Voila

colFiraddSec[(x_)?MatrixQ, (n_)?IntegerQ] := (#1[[2]] + #1 & ) /@
Cases[x, Alternatives @@ ({#1, ___} & ) /@ Range[n]]

Examples

colFiraddSec[dat, 3]
{{3, 4, 5}, {7, 8, 9}}

dat2 = Table[Random[Integer, {1, 10}], {10}, {10}]
{{5, 9, 6, 10, 3, 8, 9, 4, 8, 4}, {8, 5, 1, 4, 9, 7, 5, 3, 8, 9}, {3,
10, 10, 7, 3, 3, 9, 1, 6, 8},
  {6, 1, 1, 3, 3, 10, 1, 4, 9, 9}, {7, 5, 10, 2, 5, 2, 3, 7, 2, 3}, {2,
4, 5, 6, 10, 10, 8, 2, 8, 2},
  {6, 2, 5, 9, 1, 1, 7, 4, 3, 10}, {3, 4, 4, 3, 10, 3, 2, 9, 5, 2},
{10, 9, 7, 4, 10, 6, 6, 6, 10, 6},
  {7, 9, 5, 4, 6, 7, 5, 1, 9, 2}}

colFiraddSec[dat2, 3]
{{13, 20, 20, 17, 13, 13, 19, 11, 16, 18}, {6, 8, 9, 10, 14, 14, 12, 6,
12, 6}, {7, 8, 8, 7, 14, 7, 6, 13, 9, 6}}

And the game is over.

Regards
Dimitrios Anagnostou


------------------------------------------
We can walk our road together / If our goals are all the same
We can run alone and free / If we pursue a different aim

Let the truth of love be lighted / Let the love of truth shine clear
Sensibility / Armed with sense and liberty
With the Heart and Mind united / In a single perfect sphere

RUSH

"Cygnus X-1 Book II
Hemispheres"


  • Prev by Date: Re: Table command strange output when 'i' over 16
  • Next by Date: Help: How to deal with this problem!
  • Previous by thread: Re: Pure function in a pure function (again)
  • Next by thread: notebook interface: how make the cursor to be a 'block' cursor instead of the default?