在 MATLAB 中为自定义 类 重载索引运算符`()` 和`{}`

Overloading indexing operators `()` and `{}` for custom classes in MATLAB

我希望能够在 MATLAB 中为我的 class 重载索引运算符 (){}。特别是,我希望能够定义 class 方法,例如...

% ...
classdef MyClass < handle

    % ... other class definition stuff...

    function returnVal = operator{}(indexRange)
        %....implementation here....
    end
    function returnVal = operator()(indexRange)
        %....implementation here....
    end
end

以便我可以创建对象并执行...

x = MyClass();
returnedVals = x(:);
returnedCells = [x{:}];

% etc.

这在 MATLAB 中可行吗?我知道这在 C++ 和 python 中很容易(分别通过重载 operator []__get__ 运算符)。不过,Mathworks 网站本身并不太清楚如何执行此操作。

你需要overload the subsref and subsasgn functions within your classdef. The Mathworks provides a full example of how it works. And note that if you wish to use your overloaded method within your class, you need to call it explicitly.

如果您要实施 subsrefsubsasgn,您还需要实施:

  1. 尺码
  2. 长度
  3. ndims
  4. 结束

您还应该考虑实施 subsindex

在 MATLAB 网站上,指南 Class with Modified Index shows how to overload the ., () and {} operators via the subsref method (More recent documentation here).

这是他们为 class 提供的片段,其中 属性 称为 Data

function sref = subsref(obj,s)
   % obj(i) is equivalent to obj.Data(i)
   switch s(1).type
      case '.'
         sref = builtin('subsref',obj,s);
      case '()'
         if length(s) < 2
            sref = builtin('subsref',obj.Data,s);
         else
            sref = builtin('subsref',obj,s);
         end
      case '{}'
         error('MYDataClass:subsref',...
            'Not a supported subscripted reference')
   end
end

在 MATLAB R2021b 及更高版本中,MathWorks 推荐了一种重载索引运算符的新方法,描述了 here