我希望能够转换字符串表达式,例如" 2.0 * x * log(x)",到朱莉娅的一个函数。通常的方法是传递" x"的值将通过全局变量:
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
答案 0 :(得分:4)
这样做:
ex = parse(string)
@eval f(x) = $ex
当我插入你的字符串并且数字1返回0时,2返回2.772588,依此类推。
答案 1 :(得分:0)
使用func2
,因为您未在函数中插入x
,所以表达式仅使用符号x
构建。这会回到您在撰写x
时设置的全局func1
。
试试这个:
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
答案 2 :(得分: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