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