You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:25:50