MATLAB自定义类中end重载行为不符合预期的技术问询
问题解释与解决
1. end方法参数的真实含义
你误解了MATLAB官方文档中end方法参数k的定义:
k不是偏移量(比如end-1里的1),而是表示当前end所在的索引维度中,它是第几个需要解析的end标记(对于单维度索引场景,k永远为1)。n是索引操作的总维度数(比如A(end, end)中n=2,每个end的k分别为1和2)。
当你写A(end)或A(end-1)时,MATLAB都会调用end(A, 1, 1):
- 对于
A(end),MATLAB直接用end方法的返回值作为索引; - 对于
A(end-1),MATLAB先调用end方法获取返回值,再执行减法运算得到最终索引,偏移运算-1是在end方法返回之后处理的,不会传入k参数。
2. 你的end方法错误原因
你写的ind = length(obj.data) - k是错误的逻辑,因为k不是偏移量。正确的end方法应该直接返回对应维度的长度:
function ind = end(obj, k, n) ind = length(obj.data); % 单维度场景下返回数据长度 end
这样:
A(end)会得到3(对应obj.data的长度);A(end-1)会先调用end方法得到3,再计算3-1=2,正确取到第二个元素。
3. 重载subsref能工作的原因
当你重载subsref时,MATLAB会将包含end的索引表达式先解析成具体数值(比如end-1会被自动计算为length(obj.data)-1),再传入subsref的subs参数中。此时你直接把ind设为数据长度,相当于在subsref里手动处理了end的替换,刚好适配了单维度索引的场景,但这只是巧合——如果是多维度索引(比如A(end, 2)),这种写法就会失效,因为它没有区分不同维度的end。
内容的提问来源于stack exchange,提问作者OverLordGoldDragon
相关产品推荐
相关产品推荐

