我从.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"])
有没有一种方法,而无需键入字典中的每个键?
答案 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
最终结果是相同的,但现在您已将问题分为两个概念:
这提供了一些概念上的明确性,并且单独的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?。)