1
$\begingroup$

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.

$\endgroup$
1
  • 1
    $\begingroup$ f = With[{tmp = Cos[x]}, Compile[{{x, _Real}}, tmp]] $\endgroup$
    – ciao
    Commented Jun 22, 2014 at 21:46

2 Answers 2

1
$\begingroup$
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.]
$\endgroup$
0
$\begingroup$

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.

$\endgroup$
1
  • 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
    Commented Jun 22, 2014 at 22:27

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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