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

如何通过name属性索引Matlab对象数组(subsref问题)

解决方案

要实现通过name属性索引对象数组并返回对应value,同时保留正常的属性访问功能,需要正确重载subsref方法,区分属性访问和括号索引两种场景:

修正后的类定义

classdef DummyClass
    properties
        name = '';
        value = nan;
    end
    methods
        function obj = DummyClass(varargin)
            if nargin > 0
                obj.name = varargin{1};
                if nargin > 1
                    obj.value = varargin{2};
                end
            end
        end
        
        function out = subsref(obj, S)
            % 处理括号索引:例如 t1("a1")
            if strcmp(S.type, '()')
                target_names = S.subs{1};
                out = nan(size(target_names));
                
                for i = 1:numel(target_names)
                    % 查找对象数组中name匹配的元素索引
                    match_idx = find(strcmp({obj.name}, target_names(i)));
                    if ~isempty(match_idx)
                        % 返回第一个匹配元素的value(可根据需求改为返回所有匹配)
                        out(i) = obj(match_idx(1)).value;
                    end
                end
                
                % 单个输入时返回标量,避免不必要的数组维度
                if numel(out) == 1
                    out = out(1);
                end
            else
                % 处理属性访问:例如 t1.name,调用Matlab默认实现
                out = builtin('subsref', obj, S);
            end
        end
    end
end

测试验证

  1. 创建对象数组:
t1(1) = DummyClass("a1", 1);
t1(2) = DummyClass("a2", 2);
t1(3) = DummyClass("a3", 3);
  1. 正常访问属性:
t1.name

输出:

ans = 
  3×1 string array
    "a1"
    "a2"
    "a3"
  1. 通过name索引value:
t1("a1")       % 返回 1
t1(["a1","a3"]) % 返回 [1 3]

错误原因说明

你之前的subsref方法没有区分索引类型,直接返回固定值1:

  • 当调用t1.name时,Matlab期望返回与对象数组长度匹配的属性值集合,但自定义方法仅返回单个标量,导致"Too many output arguments"错误。
  • 通过builtin('subsref', obj, S)调用Matlab内置的索引逻辑,可保留正常的属性访问功能;同时单独处理括号索引场景,实现按name查找value的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:56:08