data-structures - Julia:自引用和递归类型

标签 data-structures struct julia self-reference

我想做的不是很直接,如果我从结果开始,然后解释我是如何达到目标的,也许会更容易。

我有一个包含两个字段的结构:

struct data{T}
    point::T
    mat::Array
end

我想做的是嵌套它并使字段垫自引用以获得类似的东西:

data{data{Int64}}(data{Int64}(1, [1]), [1])

'outer' 类型不应该存储 [1] 而是引用最里面的垫子。我不确定这是否有意义,甚至可能。场垫应该重复存储同一个大数组。

我尝试过这样的事情(n 是嵌套类型的数量。

struct data{T}
    point::T
    g::Array
    function D(f, g, n)
        for i = 1:n
            (x = new{T}(f, g); x.f = x)
        end
    end
end 

再次,我不确定我是否足够了解自引用构造函数,或者这是否可能。任何帮助/澄清将不胜感激,谢谢!

最佳答案

确切的模式将取决于您想要实现的目标,但这里有一个示例:

struct Data{V, A <: AbstractArray{V}, T} 
    mat::A
    point::T

    Data(mat::A, point::T = nothing) where {V, A <: AbstractArray{V}, T} =
        new{V,A,T}(mat,point)
end

用法

julia> d0 = Data([1,2,3])
Data{Int64,Array{Int64,1},Nothing}([1, 2, 3], nothing)

julia> d1 = Data([1.0,2.0],d0)
Data{Float64,Array{Float64,1},Data{Int64,Array{Int64,1},Nothing}}([1.0, 2.0], Data{Int64,Array{Int64,1},Nothing}([1, 2, 3], nothing))

提示:

  1. 切勿使用无类型容器。因此,当您想要存储 Array 时,您需要在 struct 定义中包含其类型。

  2. structs

  3. 使用以大写字母开头的名称
  4. 提供构造函数以使您的 API 可读

最后但并非最不重要。如果您想为这种结构设置多个嵌套级别,则编译时间将大大增加。在这种情况下,通常最好使用同质类型。在这种情况下,您也许可以使用类型 Union 来代替(少量类型的联合在 Julia 中很快)。

关于data-structures - Julia:自引用和递归类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61154522/

相关文章:

C++字节流

julia - Julia Jump 中的多个目标函数意味着什么?

julia - 为什么 Dict(5 :2) not throw an error in Julia?

javascript - 在 map 上获取可见标记的最有效方法?

写入文件时转储​​ C 程序核心

python - 当我们循环遍历所有元素时保留前 N 个元素

将变量从全局更改为局部 - C

julia - 将 DataType 的 Vector 约束为特定的抽象类型

algorithm - 从体素列表创建邻域图比 O(n^2) 更快?

java - Java 中的泛型是什么?