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 smc.vnet.net
  • Subject: [mg61424] Re: [mg61338] Re: Re: Compile nested loops with depending index variables...
  • From: "Christoph Lhotka" <lhotka at astro.univie.ac.at>
  • Date: Wed, 19 Oct 2005 02:16:04 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

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:

a[[i,j,k,l]]=F[a[[i,j,k,l]],b[[i,j,k,l]]]

(where F means some function based on basic arithmetics)

IT IS NOT NECESSARY TO RUN THROUGH ALL INDICES! SO IF i=I0, j<i, k<j, l<k for
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
again.

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

Do[a[[i,j,k,l]]=a[[i,j,k,l]]+b[[i,j,k,l]],{i,1,n},{j,1,i},{k,1,j},{l,1,k}],

but it doesn't work.

Won't you agree with me?

kind regards

Christoph




On Sun, 16 Oct 2005 00:17:54 -0400 (EDT)
 albert <awnl at arcor.de> 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 astro.univie.ac.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...