2016-04-21 77 views
1

我希望能夠轉換字符串表達式,例如「2.0 * x * log(x)」,轉換爲Julia中的函數。通常的方式做通「X」的值是通過全局變量:在Julia中,是否可以在不使用全局變量的情況下將值傳遞給Expr對象?

julia> func1 = parse("2.0*x*log(x)"); 
julia> x = 2.718281828459; 
julia> eval(func1)/2.0 
2.7182818284589545 

不過,我想知道如果我能避免使用全局變量。我嘗試了以下兩種方法,但沒有成功:

方法1

julia> func2(x) = parse("2.0*x*log(x)"); 
julia> eval(func2(1.0))/2.0 # should return zero 
2.7182818284589545 

方法2

julia> function new_func1(input_value) 
      x = input_value 
      eval(func1) 
     end 
new_func1 (generic function with 1 method) 

julia> new_func1(1.0)/2.0 # should return zero 
2.7182818284589545 
+1

怎麼樣字符串宏和一個匿名函數。 '宏p_str(X) ESC(分析(X)) 端 FUNC = X - > P 「2.0 * X *日誌(X)」 FUNC(1.0)' –

+1

或者,假設'funcstring =「2.0 * x * log(x)「',然後''eval(parse(」func1(x)= $ funcstring「))''將用'func1(1.0)== 0.0'定義'func1' –

+0

感謝您的投入 - 這些工作,以及下面的答案。我也意識到也可以使用「@generated」。 – nathanielng

回答

4

如何這樣做:

ex = parse(string) 
    @eval f(x) = $ex 

當我插入你的字符串和數字1返回0,2返回2.772588依此類推。

0

隨着func2,由於您不是在該函數內插入x,該表達式正在使用符號x構建。這正在回落到您在編寫func1時設置的全球x

試試這個:

julia> func2(x) = parse("2.0*$x*log($x)"); 

julia> eval(func2(1.0)) 
0.0 

,或者,

julia> func2(x) = eval(parse("2.0*$x*log($x)")); 

julia> func2(1.0) 
0.0 
0

看來它也可以使用@generated做到這一點:

string = "2.0*x*log(x)" 
@generated function my_func(x) 
    return parse(string) 
end 

輸出示例:

julia> println(my_func(1.0)) 
0.0 

julia> println(my_func(exp(1.0))/2.0) 
2.718281828459045 

julia> println(my_func(0.5)) 
-0.6931471805599453 

這個進一步的思考,也許它會一直最好使用點符號乘法:

string = "2.0.*x.*log(x)" 
@generated function my_func(x) 
    return parse(string) 
end 

julia> x = [1.0 0.5 exp(1.0)] 
1x3 Array{Float64,2}: 
1.0 0.5 2.71828 

julia> my_func(x) 
1x3 Array{Float64,2}: 
0.0 -0.693147 5.43656 
+0

我不知道如何解釋爲什麼這樣濫用'@ generated'這樣一個可怕的想法,但你這裏的例子並沒有做你認爲它正在做的事情。 – user1712368

相關問題