在 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.
如果您要实施 subsref
和 subsasgn
,您还需要实施:
- 尺码
- 长度
- ndims
- 数
- 结束
您还应该考虑实施 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。
我希望能够在 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.
如果您要实施 subsref
和 subsasgn
,您还需要实施:
- 尺码
- 长度
- ndims
- 数
- 结束
您还应该考虑实施 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。