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

MathGroup Archive 2010

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

Search the Archive

Re: Question: Compile in Mathematica 8.0

  • To: mathgroup at smc.vnet.net
  • Subject: [mg114704] Re: Question: Compile in Mathematica 8.0
  • From: Patrick Scheibe <pscheibe at trm.uni-leipzig.de>
  • Date: Mon, 13 Dec 2010 03:54:31 -0500 (EST)

Hi,

the situation is simple. What should the compiler assume, when it sees
something like this:

len = n*(n - 1)/2

Is it in any case an Integer? No. So lets give Compile a hint, that we
want len to be an integer:

Compile[{{n, _Integer}},
 Module[
  {len = 0},
  len = n*(n - 1)/2;
  ]
 ]

and now Compile tell us instantly:

Compile::cset: "Variable len of type \!\(\"_Integer\"\) encountered in
assignment of type \!\(\"_Real\"\)."

So what you want is maybe:

v1 = Compile[{{n, _Integer}}, Module[
   {g, len = 0},
   len = Quotient[n*(n - 1), 2];
   g = RandomVariate[NormalDistribution[0., 1.], len]]]

and everthing is fine.

In[9]:= v1[3]

Out[9]= {0.884713, 0.228091, 0.874789}

Hope this helps.

Cheers
Patrick

On Sat, 2010-12-11 at 01:52 -0500, Asim wrote:
> Hi
> 
> I am not sure why the first function named v works and why the second
> function named v1 does not compile. The only difference between the
> two functions is in the variable called len which controls the number
> of random numbers that are generated.
> 
> I am using Mathematica 8.0 on Windows Vista machine.
> 
> Thanks
> 
> Asim
> 
> 
> 
> First function:
> 
> 
> v = Compile[{{n, _Integer}},
>   Module[
>    {g, len},
>    len = n*(n - 1);
>    g = RandomVariate[NormalDistribution[0., 1.], len]
>    ]
>   ]
> 
> Output is
> 
> CompiledFunction[{n},Module[{g,len},len=n
> (n-1);g=RandomVariate[NormalDistribution[0.,1.],len]],-CompiledCode-]
> 
> v[3]
> 
> {0.0866864,-0.271121,-0.431317,-0.6787,-1.29246,0.550486}
> 
> Second Function:
> 
> v1 = Compile[{{n, _Integer}},
>   Module[
>    {g, len},
>    len = n*(n - 1)/2;
>    g = RandomVariate[NormalDistribution[0., 1.], len]
>    ]
>   ]
> 
> CompiledFunction[{n},Module[{g,len},len=1/2 n
> (n-1);g=RandomVariate[NormalDistribution[0.,1.],len]],-CompiledCode-]
> 
> v1[3]
> 
> During evaluation of In[42]:= CompiledFunction::cfse: Compiled
> expression {-0.325949,1.72381,0.368231} should be a machine-size
> integer. >>
> 
> During evaluation of In[42]:= CompiledFunction::cfex: Could not
> complete external evaluation at instruction 8; proceeding with
> uncompiled evaluation. >>
> 
> Out[42]= {0.295626, 0.664446, 0.654626}
> 
> 
> 
> 



  • Prev by Date: How to create a notebook outside of Mathematica?
  • Next by Date: Re: Puzzled by IntegerPart
  • Previous by thread: Re: Question: Compile in Mathematica 8.0
  • Next by thread: Re: Question: Compile in Mathematica 8.0