如何从Julia中的字典创建结构或类型?

时间:2019-06-02 20:46:57

标签: matlab dictionary struct julia

我从.mat文件(MATLAB格式)中导入了一堆数据,它们以字典的形式出现,但是使用它们有点麻烦,所以我想将其传递给结构。我知道我可以做到:

using MAT

struct model
    trans
    means
    vars
end

vars = matread("data.mat")
hmm1=model(vars["hmm1"]["trans"],vars["hmm1"]["means"],vars["hmm1"]["vars"])

有没有一种方法,而无需键入字典中的每个键?

2 个答案:

答案 0 :(得分:0)

可能无法避免直接访问字典的相关键。但是,您可以通过创建一个自定义Model的构造函数,使其简化为Dict

using MAT

struct Model
    trans
    means
    vars
end

function Model(d::Dict)
    h = d["hmm1"]
    Model(h["trans"], h["means"], h["vars"])
end

vars = matread("data.mat")

Model(vars)

编辑:

要扩展下面@DNF的注释,您可以编写两个新的构造函数,而不是一个,以分离出不同的概念:

function Model(params::Dict)
    Model(params["trans"], params["means"], params["vars"])
end

function Model(matlab::Dict)
    params = matlab["hmm1"]
    Model(params)
end

最终结果是相同的,但现在您已将问题分为两个概念:

  1. 从参数字典构建模型。
  2. 使用Matlab数据字典构建模型。

这提供了一些概念上的明确性,并且单独的Model(params::Dict)构造函数可能在将来在不同的上下文中很有用。

答案 1 :(得分:0)

如果您只担心点访问语法 à la hmm1.means,您可以改用 NamedTuple

julia> vars = Dict("hmm1"=>Dict("trans"=>1, "means"=>2, "vars"=>3)) ;

julia> hmm1 = (; (Symbol(k) => v for (k,v) in vars["hmm1"])...)
(trans = 1, vars = 3, means = 2)

julia> hmm1.means
2

(取自并改编自 Julia discourse: How to make a named tuple from a dictionary?。)