用户定义的类具有与内置类相同的索引行为。类可以通过重载MATLAB的函数来定制索引操作®调用求索引表达式的值。超载subsref
和subsasgn
函数,当您想为索引引用和赋值定义特殊行为时。
有关对象索引的概述,请参见对象数组索引.
MATLAB调用subsref
和subsasgn
使用这些参数的类的方法。
方法 | 输入 | 输出 |
---|---|---|
|
|
|
|
|
|
如果类设计要求索引操作返回或分配与默认索引操作定义的数值不同数量的值,则重载numArgumentsFromSubscript
函数来控制nargout
为subsref
和输入参数个数
为subsasgn
.有关更多信息和示例,请参见numArgumentsFromSubscript
.
索引结构包含描述索引表达式的信息。类方法使用索引结构中的信息来计算表达式并实现自定义行为。
例如,CustomIndex
类定义可以在索引表达式中使用的属性。
classdefCustomIndex属性DataArray结束结束
创建一个对象并分配一个由魔法
函数DataArray
财产。
一个= CustomIndex;a.DataArray =魔法(5);
这个下标引用表达式返回5 × 5矩阵的第一行。
: a.DataArray (1)
Ans = 17 24 1 8 15
属性中存储的数组的第一行被赋新值DataArray
财产。
a.DataArray(1,:) = [1 2 3 4 5];
这个赋值语句使用:
一个“。”
引用类型
点后面的属性名(即,DataArray
)
一系列指数(1,:
括号内)
索引结构在类型
和潜艇
字段。
当执行索引表达式时,MATLAB调用该类subsref
或subsasgn
方法,如果类重载这些函数。传递给该方法的参数之一是索引结构。索引结构有两个字段:
类型
-三种可能的索引类型之一:“。”
,“()”
,“{}”
潜艇
——一个字符
向量,具有表达式中使用的索引的属性名或单元格数组,包括:
和结束
.
如果索引表达式是一个复合表达式,那么MATLAB将传递一个结构数组,1结构体
用于每一级索引。例如,在这个表达式中:
: a.DataArray (1)
索引结构数组年代
这些值:
(1) .type
被设置为“。”
,表示第一个索引操作是一个点。
(1) .subs
设置为属性名,“DataArray”
索引的第二层是索引结构的第二个元素:
(2) .types
被设置为“()”
表示第二个索引操作是圆括号索引
(2) .subs
设置为包含索引的单元格数组{[1], [:]}
超载了subsref
和subasgn
功能:
属性确定完整索引表达式类型
和潜艇
索引结构的字段。
为类支持的索引操作实现专门化行为。金宝app
返回适当的值或修改的对象,以响应MATLAB的调用。
一个开关
语句是检测第一级索引的一种方便的方法。索引有三种类型:点、圆括号和大括号。每一个情况下
块的开关
语句实现以该第一级索引类型开始的所有索引表达式。
这些方法必须实现类支持的所有索引表达式。金宝app如果没有自定义特定类型的索引,则调用内置函数来处理该表达式。
使用索引结构数组的长度和索引类型为复合索引表达式定义条件语句。
subsref
方法下面的框架为subsref
方法显示如何在条件语句中使用索引结构中的信息。您的应用程序可能涉及这里没有显示的其他表达式。
函数varargout = subsref (obj,年代)开关(1) .type情况下“。”如果长度(s) = = 1%实现obj。PropertyName...elseifstrcmp(s(2)).type,“()”)%实现obj.PropertyName(指数)...其他的[varargout {1: nargout}] =内装式(“subsref”obj,年代);结束情况下“()”如果长度(s) = = 1%实现obj(指数)...elseifstrcmp(s(2)).type,“。”)%实现obj(印第安纳州)。PropertyName...elseifstrcmp(s(2)).type,“。”) & & strcmp (s (3) .type,“()”)%实现obj(指数).PropertyName(指数)...其他的%使用内置的任何其他表达式[varargout {1: nargout}] =内装式(“subsref”obj,年代);结束情况下“{}”如果长度(s) = = 1%实现obj{指数}...elseifstrcmp(s(2)).type,“。”)%实现obj{指数}。PropertyName...其他的%使用内置的任何其他表达式[varargout {1: nargout}] =内装式(“subsref”obj,年代);结束否则错误('不是有效的索引表达式')结束
使用varargout
使该方法能够处理对象数组。例如,假设您希望支持返回一个逗号分隔的列表,该列表包含如下表达式:金宝app
(x1,…xn) = objArray。PropertyName(指数)
该表达式将生成一个双元素索引结构数组。第一级类型是点(“。”
),第二层是括号(“()”
).构建varargout
单元格数组,数组中的每个值。
情况下“。”...如果长度(s) = = 2 & & strcmp (s (2) .type,“()”) prop = s(1).subs;%属性名n =元素个数(obj);%数组中元素的个数varargout =细胞(1,n);%预分配单元格阵列为K = 1:n varargout{K} = obj(K).(prop).(s(2).subs);结束结束...结束
下面的框架为subsasgn
方法演示如何在实现赋值操作的条件语句中使用索引结构。
函数obj = subsasgn (obj,年代变长度输入宗量)允许下标赋值给未初始化的变量如果isequal (obj, [])% obj = ClassName.empty;结束开关(1) .type情况下“。”如果长度(s) = = 1%实现obj。PropertyName= varargin{:};...elseifstrcmp(s(2)).type,“()”)%实现obj.PropertyName(indices) = varargin{:};...其他的%调用内置的任何其他情况obj =内装式(“subsasgn”obj,年代变长度输入宗量{:});结束情况下“()”如果长度(s) = = 1%实现obj(indices) = varargin{:};elseifstrcmp(s(2)).type,“。”)%实现obj(指数)。PropertyName= varargin{:};...elseifstrcmp(s(2)).type,“。”) & & strcmp (s (3) .type,“()”)%实现obj(indices).PropertyName(indices) = varargin{:};...其他的%使用内置的任何其他表达式obj =内装式(“subsasgn”obj,年代变长度输入宗量{:});结束情况下“{}”如果长度(s) = = 1%实现obj{indices} = varargin{:}...elseifstrcmp(s(2)).type,“。”)%实现obj{指数}。PropertyName= varargin{:}...%使用内置的任何其他表达式obj =内装式(“subsasgn”obj,年代变长度输入宗量{:});结束否则错误('不是有效的索引表达式')结束结束
使用变长度输入宗量
赋值语句的右侧值使该方法能够使用对象数组。例如,假设你想支持用如下表达式对逗号分隔的列表赋值:金宝app
C ={“一”,“两个”;“三个”};[objArray。PropertyName] = C {:}
该表达式将生成一个点类型为(“。”
)索引单元格数组C
在赋值语句的右侧产生一个以逗号分隔的列表。这段代码为对象数组中的每个属性分配一个列表项。
情况下“。”如果Length (s)==1 prop = s(1);%属性名n =元素个数(obj);%数组中元素的个数为K = 1:n obj(K).(prop) = varargin{K};结束结束结束