【问题标题】:Julia: Assign and Get FunctionsJulia:分配和获取函数
【发布时间】:2014-04-09 17:34:36
【问题描述】:

我希望能够通过一个简单的字符串循环为 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”是因为我在 R 中习惯了它们。

我想这样做的原因是因为我有一个函数,它接受多个参数,这些参数都是相同的,我认为重复代码没有意义。比如:

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

但是,这会给“设置索引”带来其他问题,我需要进一步阅读。感谢您的考虑! 弗朗西斯

【问题讨论】:

  • 出于好奇,您认为这比使用数组或字典有什么优势?
  • 这种东西推荐。如答案所示,可以这样做,但这不是一个好主意。
  • 你绝对应该做类似后一种尝试的事情。我修复了它,因此语法正确,并且它实际上运行了。

标签: assign julia


【解决方案1】:

在你提出第二个建议后,我想你可能真的想要这样的东西。

function f(args...)
    acc = zero(args[1])
    for a in args
        if a < 0
            acc -= 9999
        else
            acc += a
        end
    end
    acc
end

用法就像

【讨论】:

  • 我喜欢这个!唯一的窍门是,我确实会有一些参数采用相同的值,而有些则没有,但我很确定我可以轻松修改此代码function f(a=1,b=2,c=3,d=4, printout=true); acc = (a,b,c,d); ...
  • 当我们处理可能与您的实际问题有相同解决方案的玩具示例时,很难为您的问题找到正确的解决方案。很高兴我能提供帮助:)
【解决方案2】:

这就是诀窍:

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

【讨论】:

  • 编辑了问题以提供更多动力。
【解决方案3】:

要在 Julia 中进行这种奇怪的动态变量 trixing,您必须使用宏和元编程。它的要点是一个非常强大的代码生成接口。我认为可以编写一个与表单上的上述代码相同的宏

x1, x2, x3, x4 = 14, 12, 34, 19
@assign("abcd", 1:4)

并将“编译时间”转换为

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") 来获得相同的循环。

【讨论】:

    猜你喜欢
    • 2022-12-21
    • 2023-03-20
    • 1970-01-01
    • 2020-09-04
    • 2021-02-14
    • 2023-01-12
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    相关资源
    最近更新 更多