MathGroup Archive 2005

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

Search the Archive

Re: Re: Re: Compile nested loops with depending index variables...

  • To: mathgroup at
  • Subject: [mg61424] Re: [mg61338] Re: Re: Compile nested loops with depending index variables...
  • From: "Christoph Lhotka" <lhotka at>
  • Date: Wed, 19 Oct 2005 02:16:04 -0400 (EDT)
  • Sender: owner-wri-mathgroup at

First thank you all, but the main problem is still unbsolved.

My specific problem is, that I have two rectangular arrays say a and b of
about 500 000 numbers (complex or real) each. I want to create a new array of
the same dimension and length, where each element has to be constructed by a
law depending on the position in above lists of the form:


(where F means some function based on basic arithmetics)

any I0=1,...,n!

To save computation time I wanted to compile and didn't succeed. Using a small
C++ program and MathLink will speed it up, but transferring millions of
numbers from the kernel to the C program and vice versa seems to slow it down

I think that it should be a basic feature for any compiler to understand such
a basic code construct like:


but it doesn't work.

Won't you agree with me?

kind regards


On Sun, 16 Oct 2005 00:17:54 -0400 (EDT)
 albert <awnl at> wrote:
> Hi Christoph,
> this is from the HelpBrowser about Compile:
> o Nested lists given as input to a compiled function must be full arrays of
> numbers. 
> the table you construct is not a "full array of numbers", since the length
> of each element is different:
> In[4]:= Length /@ Table[{i,j},{i,0,n},{j,0,i}]
> Out[4]= {1, 2, 3, 4}
> and obviously Compile not only doesn't like this sort of nested lists as
> input but also can't handle these anyware within the compiled code. This is
> not too surprising but not explicitly documented so. So I think if you
> really need to compile your code you need to change it in such a way that
> it constructs a "full array", e.g. the following compiles fine:
> fc = Compile[{n}, Table[If[j <= i, {i, j}, {-1, -1}], {i, 0, n}, {j, 0,
> n}]]
> you could then reconstruct the original nested list by:
> DeleteCases[fc[2], {-1, -1}, Infinity]
> It depends on your actual problem whether this is more efficient than not
> compiling, and usually only trying out will give you the answer. Memory
> usage is of course worse than when using the not compiled nested Table...
> This is another approach that is probably more memory efficient:
> fc = Compile[{{i, _Integer}}, Table[{i, j}, {j, 0, i}]]
> ffc = Function[{n}, Table[fc[i], {i, 0, n}]]
> note that using Function instead of ffc[n_] is often slightly more
> efficient
> because you avoid complicated pattern matching. The drawback is that you
> can't do checks about correct input that easily (like in ffc[n_Integer])...
> just try what is the most efficient way for your problem, I wouldn't
> exclude
> that not compiling gives you the fastest code in the end...
> hth
> albert

-- Mag. Christoph Lhotka --
University of Vienna / Institute for Astronomy
mail. lhotka at

  • Prev by Date: Re: Double integral of a piecewise-constant function
  • Next by Date: Re: Solving Diophantine Equations
  • Previous by thread: Re: Re: Compile nested loops with depending index variables...
  • Next by thread: Re: Compile nested loops with depending index variables...