我希望能够通过简单的字符串循环为Julia中的变量赋值。
例如:
x1, x2, x3, x4 = 14, 12, 34, 19
letters = "abcd"
for i in 1:4
val = get("x$i")
var = letters[i]
assign(var, val)
end
a
14
注意,我选择“assign”和“get”这个函数,因为我已经习惯了它。
我想要这样做的原因是因为我有一个函数,它接受多个参数,这些参数都被相同地评估,并且我认为没有重复代码的点。类似的东西:
function f(a,b,c,d)
if a<0 a==-9999 end
if b<0 b==-9999 end
if c<0 c==-9999 end
if d<0 d==-9999 end
end
当然,我应用于每个函数的函数实际上比简单的重新编码命令长得多。
我想我可以这样做:
function f(a=1,b=2,c=3,d=4, p=[a,b,c,d])
for (i in 1:4)
if p[i]<0
p[i]=-9999
end
end
sum(p)
end
然而,这会产生“set index”的其他问题,这是我需要阅读的更多信息。谢谢你的考虑! 弗朗西斯
答案 0 :(得分:1)
这就是诀窍:
x1, x2, x3, x4 = 14, 12, 34, 19
letters = "abcd"
for i in 1:4
assignment = parse("$(letters[i]) = x$(i)")
eval(assignment)
end
您可以在这里阅读parse
函数,它将字符串转换为表达式:
http://julia.readthedocs.org/en/latest/stdlib/base/#Base.parse
答案 1 :(得分:1)
在你第二个建议做什么后,我想你可能真的想要这样的东西。
function f(args...)
acc = zero(args[1])
for a in args
if a < 0
acc -= 9999
else
acc += a
end
end
acc
end
用法就像
答案 2 :(得分:0)
要在Julia中做这种奇怪的动态变量trixing,你必须使用宏和元编程。它的要点是代码生成的一个非常强大的接口。我认为可以在表单
上编写一个与上述代码相同的宏x1, x2, x3, x4 = 14, 12, 34, 19
@assign("abcd", 1:4)
并翻译&#34;编译时间&#34;到
x1, x2, x3, x4 = 14, 12, 34, 19
begin
a = x1
b = x2
c = x3
d = x4
end
编写和调试这样一个宏需要一些时间。你能描述一下你的用例,所以我可以看看是否存在一些实际上不重要的约束,或者你想要的更多功能?例如1:4
似乎是多余的,因为我可以使用for (i, letter) in enumerate("abcd")
来获得相同的循环。