朱莉娅:我怎样才能使这个重复的条件语句代码更短?

Rea*_*abo 1 julia

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

另外,我怎样才能使它更紧凑?

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
Run Code Online (Sandbox Code Playgroud)

Bog*_*ski 7

我会建议不要创建变量D1,以D15直接,而是让他们在向量的向量并分配给他们这样的:

D = [zeros(3300) for i in 1:15]
for i in 1:3300
    D[dt[i,2]][i] = 1
end
Run Code Online (Sandbox Code Playgroud)

现在D[i]相当于你的Di.

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

for i in 1:15
    eval(:($(Symbol("D", i)) = D[$i]))
end
Run Code Online (Sandbox Code Playgroud)

你会得到Di变量.



这个:角色在朱莉娅有两个句法目的.第一种形式创建一个Symbol,一个用作表达式构建块的实习字符串:

julia> :foo
:foo

julia> typeof(ans)
Symbol
Run Code Online (Sandbox Code Playgroud)

第二个是Range运算符.a:b构造一个范围从a到b的步长为1(UnitRange),并且a:s:b类似但使用步长s(StepRange).


Julia允许插入字符串文字$,如Perl中所示:

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

julia> "1 + 2 = $(1 + 2)"
"1 + 2 = 3"
Run Code Online (Sandbox Code Playgroud)

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

julia> x = 1
1

julia> :(x = $x)
:(x = 1)
Run Code Online (Sandbox Code Playgroud)

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

julia> Symbol("my", "name")
:myname
Run Code Online (Sandbox Code Playgroud)