【问题标题】:How to initialize an array inside a struct in Julia?如何在 Julia 的结构中初始化数组?
【发布时间】:2021-09-01 01:56:33
【问题描述】:

我是 Julia 的新手。测试以下代码以初始化结构内的数组。

struct Foo
  alpha :: Array{Float64,2}
  beta  :: Array{Float64,2}
  
  function Foo(nrow::Int,ncol::Int)
    new( zeros(Float64, nrow, ncol),
      zeros(Float64, nrow, ncol) );
  end

end

f1 = Foo(3,3)

println(f1.beta)

其中,结构内的数组大小在运行之前不会确定。我想知道这是否是为 alpha 和 beta 分配内存的正确方法(尤其是在性能方面)。

【问题讨论】:

    标签: arrays struct julia


    【解决方案1】:

    您的代码花费一些时间用零填充分配的Matrix,更快的版本是:

    struct Foo
      alpha :: Array{Float64,2}
      beta  :: Array{Float64,2}  
      function Foo(nrow::Int,ncol::Int)
        new( Matrix{Float64}(undef, nrow, ncol),
          Matrix{Float64}(undef, nrow, ncol) );
      end
    end
    

    这当然会导致数组一开始就存在一些数据。

    您可以考虑将对象的大小作为其类型定义的一部分:

    Base.@kwdef struct Foo2{N,M}
      alpha::Array{Float64,2} = zeros(Float64, N, M)
      beta::Array{Float64,2} = zeros(Float64, N, M)
    end
    

    请注意,我使用 Base.@kwdef 生成了一个构造函数,这会导致代码更短。 我使用zeros 是为了便于阅读,但是undef 构造函数的使用方式与上例类似。

    这个struct可以简单地用作:

    julia> Foo2{2,3}()
    Foo2{2, 3}([0.0 0.0 0.0; 0.0 0.0 0.0], [0.0 0.0 0.0; 0.0 0.0 0.0])
    

    上述“将我的尺寸存储在类型中”的方法更多的是关于样式而不是性能,除非您开始编写代码来实际使用这些信息。

    最简单的开始方法是通过StaticArrays

    using StaticArrays
    Base.@kwdef struct Foo3{N,M}
      alpha::MMatrix{N,M,Float64} = MMatrix{N,M}(zeros(Float64, N, M))
      beta::MMatrix{N,M,Float64} = MMatrix{N,M}(zeros(Float64, N, M))
    end
    

    这个struct又可以用作:

    julia> Foo3{2,3}()
    Foo3{2, 3}([0.0 0.0 0.0; 0.0 0.0 0.0], [0.0 0.0 0.0; 0.0 0.0 0.0])
    

    静态数组要快得多,但编译时需要大量类型。基本上,将它们用于具有多达 50 个元素的数组是有意义的。

    【讨论】:

    • 非常感谢!顺便说一句,“Base.@kwdef”有什么用?经过一些实验,在我看来它允许字段的默认值。如果我错了,请纠正我。
    • 是的,它允许字段的默认值。还有一个 Parameters.jl 包,它通过一些扩展提供相同的功能。在我的生产代码中,我通常使用 Parameters.jl
    【解决方案2】:

    是的。

    如果真的担心大小跑不定,可以看看StaticArrays.jl

    【讨论】:

      猜你喜欢
      • 2013-12-23
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 2021-04-30
      相关资源
      最近更新 更多