代码模式subsref和subsasgn方法
R2021b和后,自定义索引的推荐过程是使用模块化的索引代替重载父类subsref
和subsasgn
。有关更多信息,请参见定制对象索引。
自定义索引引用和任务
用户定义的类具有相同的索引的内置类的行为。类可以定制索引操作通过重载MATLAB的函数®调用索引表达式进行评估。超载subsref
和subsasgn
功能当你想定义索引引用和分配的特殊行为。
语法subsref和subsasgn方法
MATLAB调用subsref
和subsasgn
你的类的方法和这些参数。
方法 | 输入 | 输出 |
---|---|---|
|
|
|
|
|
|
修改数量的参数
如果你的类设计要求索引操作返回或者分配一个不同的值的数量比定义的默认索引操作,过载numArgumentsFromSubscript
函数来控制nargout
为subsref
和输入参数个数
为subsasgn
。的更多信息和示例,请参阅numArgumentsFromSubscript
。
索引结构描述索引表达式
索引结构包含描述信息索引表达式。类方法使用索引结构来评估中的信息表达和实现自定义行为。
例如,CustomIndex
类定义了一个属性,您可以使用索引表达式。
classdefCustomIndex属性DataArray结束结束
创建一个对象并分配一个5-by-5矩阵创建的魔法
函数DataArray
财产。
一个= CustomIndex;一个。DataArray =魔法(5);
这个下标引用表达式返回的第一行5-by-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通过一个结构数组,一个结构体
为每个索引。例如,在这个表达式:
:a.DataArray (1)
数组的索引结构年代
这些值:
(1).type
被设置为“。”
,这表明第一个索引操作是一个点。(1).subs
设置为属性名,“DataArray”
第二个级别的索引是第二个元素的索引结构:
(2).types
被设置为“()”
括号表示第二个索引操作索引(2).subs
被设置为一个单元阵列包含指标{[1],[:]}
典型模式索引方法
超载了subsref
和subasgn
功能:
确定完整的索引表达式使用
类型
和潜艇
字段的索引结构。实现专业为支持的索引操作类的行为。金宝app
返回相应的值或修改对象的调用MATLAB。
一个开关
语句是一种方便的方法来检测的第一级索引。有三种类型的indexing-dot,括号,括号。每一个情况下
块的开关
语句实现的所有索引表达式开始,一级类型的索引。
方法必须实现所有索引表达式类支持。金宝app如果你不定制一个特定类型的索引、调用内置的函数来处理这个表达式。
使用索引结构数组的长度和索引类型为复合索引表达式定义条件语句。
代码框架subsref
方法
下面的框架subsref
方法显示了如何在条件语句中使用信息的索引结构。这里没有显示您的应用程序可能涉及其他表达式。
函数varargout = subsref (obj,年代)开关(1).type情况下“。”如果长度(s) = = 1%实现obj.PropertyName…elseif长度(s) = = 2 & & strcmp (s (2) .type,“()”)%实现obj.PropertyName(指数)…其他的[varargout {1: nargout}] =内装式(“subsref”obj,年代);结束情况下“()”如果长度(s) = = 1%实现obj(指数)…elseif长度(s) = = 2 & & strcmp (s (2) .type,“。”)%实现obj .PropertyName(印第安纳州)…elseif长度(s) = = 3 & & strcmp (s (2) .type,“。”)& & strcmp (s (3) .type,“()”)%实现obj(指数).PropertyName(指数)…其他的%使用内置的其他表情[varargout {1: nargout}] =内装式(“subsref”obj,年代);结束情况下“{}”如果长度(s) = = 1%实现obj{指数}…elseif长度(s) = = 2 & & strcmp (s (2) .type,“。”)% obj{指数}.PropertyName实现…其他的%使用内置的其他表情[varargout {1: nargout}] =内装式(“subsref”obj,年代);结束否则错误(不是一个有效的索引表达式的)结束
使用varargout
的返回值使方法与对象数组。例如,假设您想要支持一个以逗号分隔的回归这样的表达式:金宝app
(x1,…xn) = objArray。PropertyName(指数)
这个表达式的结果在一个双元素数组索引结构。第一级类型是点(“。”
),第二层次是括号(“()”
)。构建varargout
单元阵列中的每个值数组。
情况下“。”…如果长度(s) = = 2 & & strcmp (s (2) .type,“()”)支持= s (1) .subs;%属性名n =元素个数(obj);%的元素数组varargout =细胞(1,n);% Preallocate单元阵列为k = 1: n varargout {k} = obj (k)。(道具)。(s (2) .subs);结束结束…结束
subsasgn模式
下面的框架subsasgn
方法展示了如何使用索引结构条件语句实现赋值操作。
函数obj = subsasgn (obj,年代变长度输入宗量)%允许下标赋值未初始化变量如果isequal (obj, [])% obj = ClassName.empty;结束开关(1).type情况下“。”如果长度(s) = = 1%实现obj.PropertyName= varargin{:};…elseif长度(s) = = 2 & & strcmp (s (2) .type,“()”)%实现obj.PropertyName(指数)=变长度输入宗量{:};…其他的%调用内置的其他情况obj =内装式(“subsasgn”obj,年代变长度输入宗量{:});结束情况下“()”如果长度(s) = = 1%实现obj(指数)=变长度输入宗量{:};elseif长度(s) = = 2 & & strcmp (s (2) .type,“。”)%实现obj(指数)。PropertyName= varargin{:};…elseif长度(s) = = 3 & & strcmp (s (2) .type,“。”)& & strcmp (s (3) .type,“()”)%实现obj(指数).PropertyName(指数)=变长度输入宗量{:};…其他的%使用内置的其他表情obj =内装式(“subsasgn”obj,年代变长度输入宗量{:});结束情况下“{}”如果长度(s) = = 1%实现obj{指数}=变长度输入宗量{:}…elseif长度(s) = = 2 & & strcmp (s (2) .type,“。”)% obj{指数}.PropertyName实现= varargin{:}…%使用内置的其他表情obj =内装式(“subsasgn”obj,年代变长度输入宗量{:});结束否则错误(不是一个有效的索引表达式的)结束结束
使用变长度输入宗量
右值的赋值语句使方法与对象数组。例如,假设您想要支持一个以逗号分隔的分配这样的表达式:金宝app
C ={“一”,“两个”;“三个”};[objArray。PropertyName]= C {:}
这个表达式的结果在一个索引结构点类型(“。”
)索引单元阵列C
赋值语句的右边产生一个逗号分隔的列表。这段代码分配一个对象数组中的每个属性列表项。
情况下“。”如果长度(s) = = 1 = s (1) .subs提案;%属性名n =元素个数(obj);%的元素数组为k = 1: n obj (k)。(道具)=变长度输入宗量{k};结束结束结束
下标和未初始化的变量赋值
指定一个元素的未初始化的变量在调用结果subsasgn
方法类的右边的任务。例如,这个类定义了一个subsasgn
方法简单地调用内置的subsasgn
括号索引的方法。
classdefMyClass方法函数obj = subsasgn (obj,年代变长度输入宗量)开关(1).type情况下“()”obj =内装式(“subsasgn”obj,年代变长度输入宗量{:});结束结束结束结束
当试图分配的对象MyClass
未初始化变量的第一个元素,B (1)
在接下来的声明,MATLAB调用subsasgn
的方法MyClass
一个空的双([]
)作为第一个参数。赋值会导致一个错误,因为subsasgn
方法必须通过一个对象的类。
清晰的BB (1) = MyClass;
以下错误发生转换从MyClass到双:转换从MyClass双是不可能的。误差在MyClass / subsasgn(第6行)obj =内装式(subsasgn, obj,年代,变长度输入宗量{:});
的subsasgn
方法可以检测到这种情况,采取适当的行动,如返回一个有用的错误消息如果类不支持这种类型的作业,或将输入转换为类的一个对象,并通过它来金宝appsubsasgn
。
例如,因为MyClass
可以允许下标赋值未初始化的变量,subsasgn
方法的第一个参数可以改变空双空MyClass
对象。
classdefMyClass方法函数obj = subsasgn (obj,年代变长度输入宗量)如果isequal (obj, []) obj = MyClass.empty;结束obj =内装式(“subsasgn”obj,年代变长度输入宗量{:});结束结束结束
下标赋值未初始化的变量现在避免以前的错误。
清晰的BB (1) = MyClass;
B = MyClass没有属性。