如何通过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
测试验证
- 创建对象数组:
t1(1) = DummyClass("a1", 1); t1(2) = DummyClass("a2", 2); t1(3) = DummyClass("a3", 3);
- 正常访问属性:
t1.name
输出:
ans = 3×1 string array "a1" "a2" "a3"
- 通过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
相关产品推荐
相关产品推荐

