Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I'm using the Compile function in Mathematica to compute say the following :

f=Compile[{x,_Real},Cos[x]]

Then I can compute f[x] for x taking any real value. Ok, let's say now that I have an expression like tmp=Cos[x].

My question is the following: Is there a way that I can compile the expression assigned to tmp without explicitly typing "Cos[x]" in the Compile function ? I.e. I want to do something like :

f=Compile[{x,_Real},tmp]

But that won't work it seems. In principle I'd like the value assigned to tmp to be a somewhat huge and complicated symbolic function of x that I would like to compile for numerical efficiency.

share|improve this question
1  
f = With[{tmp = Cos[x]}, Compile[{{x, _Real}}, tmp]] –  rasher Jun 22 at 21:46
    
Great. I'll take that as an accepted answer If you post it as an answer. –  VanillaSpinIce Jun 22 at 21:50

2 Answers 2

up vote 1 down vote accepted
compiler[fun_] := Compile[{{x, _Real}}, fun]

compiler[Sin[x] + x^2 - 1/(1 + x)]

enter image description here

cf = compiler[Cos[x]];

cf /@ Range[-3., 3., 6/12.]
share|improve this answer

I think the only problem is the fact the the dummy variable x doesn't appear explicitly in tmp before it tmp is evaluated. To fix this, you could define tmp as a function instead. So, I think defining your function as follows should work:

tmp[x_] = Cos[x];
f = Compile[ {x_Real} , tmp[x] ];

Moreover, I don't think the definition of the tmp function has to be a delayed expression.

share|improve this answer
1  
Kris, your reasoning is flawed. Please see CompilePrint[f] (after loading the package <<CompiledFunctionTools` ) to understand that your approach doesn't work. The reason is the HoldAll attribute of Compile. –  halirutan Jun 22 at 22:27

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.