Nested iterators in Compile
- To: mathgroup at smc.vnet.net
- Subject: [mg55010] Nested iterators in Compile
- From: Maxim <ab_def at prontomail.com>
- Date: Wed, 9 Mar 2005 06:34:35 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
The fact that iterators work differently when used in Compile seems to
lead to a serious limitation:
In[1]:=
Compile[{n},
Module[{s = 0},
Do[s += j, {i, n}, {j, i}];
s
]][10]
CompiledFunction::cfse: Compiled expression i should be a machine-size
real number.
CompiledFunction::cfex: External evaluation error at instruction 4;
proceeding with uncompiled evaluation.
Out[1]=
220
The iterator {j, i} is evaluated before any value is assigned to i, and
the evaluation of the compiled code fails (and if we add the
initialization i=0 before Do, we'll only get an empty loop as the result,
unlike the uncompiled version). So we have to resort to some workarounds
such as changing the inner iterator to {j, n} and adding If[j>i,
Continue[]] to the loop body, which of course decreases the performance.
Maxim Rytin
m.r at inbox.ru
- Follow-Ups:
- Re: Nested iterators in Compile
- From: Andrzej Kozlowski <akoz@mimuw.edu.pl>
- Re: Nested iterators in Compile