Julia Language: Как создать массив структур внутри цикла for - PullRequest
3 голосов
/ 27 марта 2020

здесь, в этом коде, я пытаюсь создать массив структуры с именем Linestruct

, но я получаю эту ошибку "связанная ошибка, попытки доступа к массиву из 0 элементов ..."

using CSV
df=CSV.read("F:/B/Mayar/lineData.CSV")

struct Linestruct
    buses::Vector{Int}
    res::Float64
    ind::Float64
    imp_mag::Float64
    imp_angle::Float64
    p::Float64
    q::Float64
    state::String
end
CREATE_Linestruct() = Linestruct([0,0], 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, "overloaded")
Linestruct(buses_line, res_line, ind_line) = Linestruct(buses_line, res_line,
    ind_line, 0.0, 0.0, 0.0, 0.0, "overloaded")

l2 = Linestruct([1,2,3], 0.0, 0.0)
l3=CREATE_Linestruct()
number_lines=size(df,1)
array_lines=Array{Linestruct,1}()

for x in 1:N
l4=CREATE_Linestruct()
array_lines[x]=l4


end

Ответы [ 2 ]

4 голосов
/ 27 марта 2020

Проблема в том, что строка

array_lines=Array{Linestruct,1}()

создает пустой массив ( т.е. массив размера 0).

После этого строка

array_lines[x]=l4

не приводит к росту массива (в отличие от того, что происходит в языке, подобном Matlab): он пытается изменить значение по индексу x в массиве. Поскольку массив пуст, вы получаете ошибку.

Минимальный пример, воспроизводящий эту ситуацию, может быть (обратите внимание, что здесь я использую вектор значений Int, поскольку ваша проблема на самом деле не связана со структурами хранения массива, а не с собственными типами):

julia> a = Array{Int, 1}()
0-element Array{Int64,1}

julia> a[1] = 1
ERROR: BoundsError: attempt to access 0-element Array{Int64,1} at index [1]

Чтобы исправить это, можно заставить массив расти, используя push! для вставки новых значений в конце:

julia> for i in 1:3
           push!(a, i)
       end

julia> a
3-element Array{Int64,1}:
 1
 2
 3
3 голосов
/ 27 марта 2020

Давайте рассмотрим эту простую структуру:

struct Mine
    a::Int
    b::String
end

Векторизация является наиболее лаконичной формой - обычно при создании Array s структур я стараюсь избегать циклов:

julia> a = Mine.([1,2,3],["b1","b2","b3"])
3-element Array{Mine,1}:
 Mine(1, "b1")
 Mine(2, "b2")
 Mine(3, "b3")

Понимание Также хорошо:

julia> [Mine(a,b) for (a,b) in [(1,"b1"),(2,"b2"),(3,"b3") ]]
3-element Array{Mine,1}:
 Mine(1, "b1")
 Mine(2, "b2")
 Mine(3, "b3")

Если другого способа нет, создайте для него пустые элементы Array и push! или append!:

julia> ar = Mine[]
0-element Array{Mine,1}

julia> push!(ar, Mine(1,"a1"));

julia> append!(ar, [Mine(2,"b1"),Mine(3,"b3")])
3-element Array{Mine,1}:
 Mine(1, "a1")
 Mine(2, "b1")
 Mine(3, "b3")
...