Mathematica 9 is now available
Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2012

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

Search the Archive

Re: Compile function and AppendTo for lists (vrs. 8.0.4)

  • To: mathgroup at smc.vnet.net
  • Subject: [mg124604] Re: Compile function and AppendTo for lists (vrs. 8.0.4)
  • From: Patrick Scheibe <pscheibe at trm.uni-leipzig.de>
  • Date: Thu, 26 Jan 2012 03:27:51 -0500 (EST)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • References: <201201241006.FAA20254@smc.vnet.net>

Hi,

using Oleks Internal`Bag suggestion, think of a list as a bag of numbers
and you can use this as replacement for the lists in your compile. Using
Oleks append-to version as comparison 

appendTo = 
 Compile[{{k, _Integer, 0}}, 
  Module[{mat = {{0, 0}}, i = 0}, 
   For[i = 1, i <= k, i++, AppendTo[mat, {1, i}]];
   Rest[mat]]]

and here is the Internal`Bag implementation

AppendTo[$ContextPath, "Internal`"];
appendBag = Compile[{{k, _Integer}},
   Module[{p = Bag[], i = 1, tmpBag},
    For[i = 1, i <= k, ++i,
     tmpBag = Bag[];
     StuffBag[tmpBag, 1];
     StuffBag[tmpBag, i];
     StuffBag[p, tmpBag];
     ];
    Table[BagPart[BagPart[p, i], All], {i, k}]
   ]
];

Speedtest shows

In[55]:= First /@ {AbsoluteTiming[appendTo[10^5]],
  AbsoluteTiming[appendBag[10^5]]}

Out[55]= {14.559237, 0.149063}

that the bag implementation is about 100 times faster. Unfortunately
there doesn't exist much documantation about this. One place to look is
here http://stackoverflow.com/a/6795762/1078614 where Daniel gives some
insights into the usage.

Hope this helps.

Cheers
Patrick



On Tue, 2012-01-24 at 05:06 -0500, kris wrote:
> Hi
> 
> I have some trouble with my code and would like ask for your help. In
> general it is about appending data in form of a list to an existing
> list in a compiled function. As far as I understand Mathematica is not
> supporting what I am asking for. In order to understand the problem in
> more detail I present some "toy" code below.
> 
> test=Compile[{{k,_Integer}},
> Module[{mat={}},
> For[i=1,i<=k,i++,
> AppendTo[mat,{1,i}];
> ];
> mat
> ]
> ];
> 
> test[2]
> (*which produces an error*)
> 
> Appending data in form of numbers for example works just fine but not
> with lists. Can anybody explain why Mathematica does not support
> appending lists to lists for compiled function? As an alternative I
> tried Reap and Sow, which also produces an error.
> 
> However, what seems funny is the following code:
> 
> mat={};
> test=Compile[{{k,_Integer}},
> For[i=1,i<=k,i++,
> AppendTo[mat,{1,i}];
> ];
> ];
> 
> test[2];mat
> 
> The above code produces the result that I was looking for in a
> cumbersome way. I would like to prefer compile code which produces the
> same result without calling the list mat again.
> 
> Thanks for help I do appreciate it.
> Cheers,
> Kris
> 





  • Prev by Date: Re: compile a numerical integral
  • Next by Date: Re: Problem with compile fct. and Thread
  • Previous by thread: Re: Compile function and AppendTo for lists (vrs. 8.0.4)
  • Next by thread: Re: Compile function and AppendTo for lists (vrs. 8.0.4)