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

如何在MATLAB类中重载subasgn实现多级字段赋值?

MATLAB类重载subasgn实现多级键赋值

需求背景

需要为自定义MATLAB类(如jdict)重载subasgn运算符,实现类似MATLAB结构体的多级键赋值操作:

obj.('elem1').('subsubelem1').('subsubelem1') = val;

标准结构体原生支持该操作,但containers.Map或dictionary不具备此能力;现有公开示例仅覆盖单级子字段赋值,自定义的jdict类已通过重载subsref实现了多级键读取,但原subasgn方法仅支持单级修改。

实现方案(基于递归逻辑)

通过递归拆解多级索引的方式,实现任意层级的键赋值及动态新增层级功能,核心subasgn重载代码如下:

function obj = subasgn(obj, s, val)
    if length(s) == 1
        % 单级赋值:根据类的存储机制处理,示例假设用obj.data存储键值对
        if ~isfield(obj.data, s.subs{1})
            % 动态新增层级,若键不存在则初始化新的jdict实例(按需调整)
            obj.data.(s.subs{1}) = jdict();
        end
        obj.data.(s.subs{1}) = val;
    else
        % 递归处理多级赋值:先获取当前层级的子对象
        current_subobj = subsref(obj, s(1));
        % 递归调用subasgn处理剩余层级的赋值
        current_subobj = subasgn(current_subobj, s(2:end), val);
        % 将修改后的子对象写回原实例
        obj = subasgn(obj, s(1), current_subobj);
    end
end

关键说明

  • 递归逻辑:将多级索引拆解为单级索引的递归调用,逐步定位到目标层级完成赋值
  • 依赖基础:需确保自定义类的subsref方法已实现多级键读取,为递归提供正确的子对象
  • 动态新增:单级赋值逻辑中加入了键不存在时的初始化逻辑,支持自动创建新的层级节点

内容的提问来源于stack exchange,提问作者FangQ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 03:14:57