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} > > > >