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


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 :


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.

  • 1
    $\begingroup$ f = With[{tmp = Cos[x]}, Compile[{{x, _Real}}, tmp]] $\endgroup$
    – ciao
    Jun 22 '14 at 21:46
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.]

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.

  • 2
    $\begingroup$ 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. $\endgroup$
    – halirutan
    Jun 22 '14 at 22:27

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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