朱莉娅:如何使这段重复的条件语句代码更短?

时间:2018-10-10 13:46:09

标签: julia

我想创建15个虚拟变量,并在以下代码中使用它们,我也想使其更短。所以问题是,如何在不使用D1=zeros(3300),...,D15=zeros(3300)的情况下使这15个虚拟变量成为可能。

此外,如何使它更紧凑?

for i=1:3300
    if dt[i,2]==1 D1[i]=1 end
    if dt[i,2]==2 D2[i]=1 end
    if dt[i,2]==3 D3[i]=1 end
    if dt[i,2]==4 D4[i]=1 end
    if dt[i,2]==5 D5[i]=1 end
    if dt[i,2]==6 D6[i]=1 end
    if dt[i,2]==7 D7[i]=1 end
    if dt[i,2]==8 D8[i]=1 end
    if dt[i,2]==9 D9[i]=1 end
    if dt[i,2]==10 D10[i]=1 end
    if dt[i,2]==11 D11[i]=1 end
    if dt[i,2]==12 D12[i]=1 end
    if dt[i,2]==13 D13[i]=1 end
    if dt[i,2]==14 D14[i]=1 end
    if dt[i,2]==15 D15[i]=1 end
end

1 个答案:

答案 0 :(得分:7)

我建议不要直接创建变量D1D15,而应将它们保存在向量的向量中并按如下方式分配给它们:

D = [zeros(3300) for i in 1:15]
for i in 1:3300
    D[dt[i,2]][i] = 1
end

现在D[i]相当于您的Di

如果您真的想在全局范围内拥有Di变量,则可以稍后编写例如:

for i in 1:15
    eval(:($(Symbol("D", i)) = D[$i]))
end

,您将获得Di变量。



:字符在Julia中具有两个语法目的。第一种形式创建一个Symbol,这是一个用作表达式的构建块的内部字符串:

julia> :foo
:foo

julia> typeof(ans)
Symbol

第二个是Range运算符。 a:b构造一个从a到b的步长为1(单位范围)的范围,而a:s:b相似,但步长为s(一个StepRange)。


Julia允许使用$插入字符串文字,如Perl:

julia> "$greet, $whom.\n"
"Hello, world.\n"

julia> "1 + 2 = $(1 + 2)"
"1 + 2 = 3"

您可以通过类似的方式插入表达式,例如:

julia> x = 1
1

julia> :(x = $x)
:(x = 1)

Symbol通过将参数的字符串表示连接在一起来创建符号。

julia> Symbol("my", "name")
:myname