【问题标题】:Julia Language: How to create an array of structs inside a for loopJulia 语言:如何在 for 循环中创建结构数组
【发布时间】:2020-03-27 17:10:25
【问题描述】:

在这段代码中,我试图创建一个名为 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

【问题讨论】:

    标签: arrays struct julia


    【解决方案1】:

    问题在于这条线

    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
    

    【讨论】:

      【解决方案2】:

      让我们考虑这个简单的结构:

      struct Mine
          a::Int
          b::String
      end
      

      向量化是最简洁的形式 - 通常在创建 Arrays 的结构时,我会尽量避免循环:

      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")
      

      如果没有其他方法,请为其创建一个空的 Arraypush!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")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-01
        • 2021-09-04
        • 2014-02-09
        • 1970-01-01
        • 2019-04-14
        • 1970-01-01
        • 1970-01-01
        • 2014-01-17
        相关资源
        最近更新 更多