文档

subsref和subsgn方法的代码模式

自定义索引引用和赋值

用户定义的类具有与内置类相同的索引行为。类可以通过重载MATLAB的函数来定制索引操作®调用求索引表达式的值。超载subsrefsubsasgn函数,当您想为索引引用和赋值定义特殊行为时。

有关对象索引的概述,请参见对象数组索引

subsref和subsgn方法的语法

MATLAB调用subsrefsubsasgn使用这些参数的类的方法。

方法 输入 输出

b = subsref (obj, s)

  • obj-索引表达式中使用的对象或对象数组

  • 年代——索引结构

b—索引表达式的结果

obj = subsasgn (obj,年代,b)

  • obj-索引表达式中使用的对象或对象数组

  • 年代——索引结构

  • b-价值分配

obj-赋值后的对象或对象数组

修改参数个数

如果类设计要求索引操作返回或分配与默认索引操作定义的数值不同数量的值,则重载numArgumentsFromSubscript函数来控制nargoutsubsref输入参数个数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调用该类subsrefsubsasgn方法,如果类重载这些函数。传递给该方法的参数之一是索引结构。索引结构有两个字段:

  • 类型-三种可能的索引类型之一:“。”“()”“{}”

  • 潜艇——一个字符向量,具有表达式中使用的索引的属性名或单元格数组,包括结束

如果索引表达式是一个复合表达式,那么MATLAB将传递一个结构数组,1结构体用于每一级索引。例如,在这个表达式中:

: a.DataArray (1)

索引结构数组年代这些值:

  • (1) .type被设置为“。”,表示第一个索引操作是一个点。

  • (1) .subs设置为属性名,“DataArray”

索引的第二层是索引结构的第二个元素:

  • (2) .types被设置为“()”表示第二个索引操作是圆括号索引

  • (2) .subs设置为包含索引的单元格数组{[1], [:]}

索引方法的典型模式

超载了subsrefsubasgn功能:

  • 属性确定完整索引表达式类型潜艇索引结构的字段。

  • 为类支持的索引操作实现专门化行为。金宝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模式

下面的框架为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};结束结束结束

相关的话题