MathGroup Archive 2006

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

Search the Archive

Re: Insulating data from code

  • To: mathgroup at smc.vnet.net
  • Subject: [mg66532] Re: Insulating data from code
  • From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
  • Date: Fri, 19 May 2006 03:39:31 -0400 (EDT)
  • Organization: The Open University, Milton Keynes, UK
  • References: <e4ekai$9av$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Ray Koopman wrote:
>>From time to time I've wanted to partition the first level of one
> list, say A, the same way that another list, say B, is partitioned.
> One way to do this is
> 
> copyPartition[A_List, B_List] /; Length@A >= Length@Flatten@B :=
>                               Module[{i = 0}, Map[A[[++i]]&,B,{-1}]]
> 
> But all the methods I've thought of have a pointer that functions
> something like i in the above code. I'd like to eliminate the pointer,
> because in the unlikely event that A contains an unevaluated symbol
> that is the same as the name of the pointer with $ appended -- e.g.,
> i$, if the pointer is i -- then in the returned list that symbol will
> have a numeric value assigned to it. Unique[i] doesn't help. The
> only solution I see is the probabilistic one of giving the pointer a
> strange (random?) name that hopefully would be very unlikely to show
> up as data. But that would be giving up. Does anyone have any ideas?
> 
Hi Ray,

Please find hereunder a function that solve the problem of conflicting 
local name in the lists.

In[1]:=
copyPartition2[A_List, B_List] /;
    Length[A] >= Length[Flatten[B]] :=
   Module[{start, end},
    start = FoldList[Plus, 1, Length /@ B];
     end = start - 1; start = Most[start];
     end = Rest[end];
     ((A[[#1]] & ) /@ Range[First[#1], Last[#1]] & ) /@
      Transpose[{start, end}]]

In[2]:=
listA = {1, 2, 3, 4, 5, 6, 7, i$25, i$26, i$27};
listB = {{a, b}, {2, 6, 1.4, 5/3}, {i}, {a, b, c}};

In[4]:=
copyPartition2[listA, listB]

Out[4]=
{{1, 2}, {3, 4, 5, 6}, {7}, {i$25, i$26, i$27}}

Below, you will find some details about how the function works:

In[5]:=
start = FoldList[Plus, 1, Length /@ listB]

Out[5]=
{1, 3, 7, 8, 11}

In[6]:=
end = start - 1

Out[6]=
{0, 2, 6, 7, 10}

In[7]:=
start = Most[start]

Out[7]=
{1, 3, 7, 8}

In[8]:=
end = Rest[end]

Out[8]=
{2, 6, 7, 10}

In[9]:=
Transpose[{start, end}]

Out[9]=
{{1, 2}, {3, 6}, {7, 7}, {8, 10}}

In[10]:=
(Range[First[#1], Last[#1]] & ) /@
   Transpose[{start, end}]

Out[10]=
{{1, 2}, {3, 4, 5, 6}, {7}, {8, 9, 10}}

In[11]:=
((listA[[#1]] & ) /@ Range[First[#1], Last[#1]] & ) /@
   Transpose[{start, end}]

Out[11]=
{{1, 2}, {3, 4, 5, 6}, {7}, {i$25, i$26, i$27}}

Best regards,
Jean-Marc


  • Prev by Date: Re: Reconstructing data points from a InterpolatingFunction object
  • Next by Date: Packages--JLink class is loaded but cannot be found?
  • Previous by thread: Re: Insulating data from code
  • Next by thread: Re: Insulating data from code