Джулия: Как я могу сделать этот повторяющийся код условного оператора короче? - PullRequest
0 голосов
/ 10 октября 2018

Я хочу создать 15 фиктивных переменных и использовать их в следующем коде, который я также хотел бы сделать короче.Итак, вопрос в том, как я могу сделать эти 15 фиктивных переменных без использования D1=zeros(3300), ..., 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

1 Ответ

0 голосов
/ 10 октября 2018

Я бы рекомендовал не создавать переменные D1 до D15 напрямую, а хранить их в векторе векторов и присваивать им следующее:

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переменные.



Символ : имеет две синтаксические цели в Юлии.Первая форма создает Symbol, внутреннюю строку, используемую в качестве одного из строительных блоков выражений:

julia> :foo
:foo

julia> typeof(ans)
Symbol

Вторая - оператор Range.a:b создает диапазон от a до b с размером шага 1 (UnitRange), а a:s:b аналогичен, но использует размер шага s (StepRange).


Джулия позволяетинтерполяция в строковые литералы с использованием $, как в 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
...