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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:03:21