如何在Julia结构体中声明矩阵?实例报错求助
问题解决
错误原因
你的构造函数frame仅接受Matrix{Float64}类型的第三个参数,但调用push!时传入的undef属于UndefInitializer类型,与参数类型不匹配,因此触发MethodError。
解决方案
以下两种方法都能满足你后续赋值不同维度矩阵的需求:
方法一:扩展构造函数,支持undef参数
修改结构体定义,新增一个接受UndefInitializer的构造方法,内部初始化一个空矩阵占位:
mutable struct frame Lx::Float64 Ly::Float64 T::Matrix{Float64} # 原构造函数 function frame(Lx::Float64, Ly::Float64, T::Matrix{Float64}) return new(Lx, Ly, T) end # 新增构造方法:处理undef参数 function frame(Lx::Float64, Ly::Float64, ::UndefInitializer) return new(Lx, Ly, Matrix{Float64}(undef, 0, 0)) end end frames = frame[] push!(frames, frame(1.0, 1.0, undef)) push!(frames, frame(2.0, 1.0, undef)) # 后续赋值不同维度矩阵 frames[1].T = [1 1 2] frames[2].T = [[2 4 5 6] [7 6 1 8]] # 横向拼接为1×8矩阵,或用分号;得到2×4矩阵
方法二:直接传入临时空矩阵(不修改构造函数)
保持原构造函数不变,push!时传入一个0×0的未定义矩阵占位:
mutable struct frame Lx::Float64 Ly::Float64 T::Matrix{Float64} function frame(Lx::Float64, Ly::Float64, T::Matrix{Float64}) return new(Lx, Ly, T) end end frames = frame[] # 传入0×0的未定义矩阵作为占位 push!(frames, frame(1.0, 1.0, Matrix{Float64}(undef, 0, 0))) push!(frames, frame(2.0, 1.0, Matrix{Float64}(undef, 0, 0))) # 后续赋值不同维度矩阵 frames[1].T = [1 1 2] frames[2].T = [[2 4 5 6]; [7 6 1 8]] # 纵向拼接为2×4矩阵
关键说明
由于你的结构体是mutable类型,字段T允许后续修改赋值。只要新赋值的对象是Matrix{Float64}类型(无论维度如何),都能合法替换初始的占位矩阵。
内容的提问来源于stack exchange,提问作者rei w
相关产品推荐
相关产品推荐

