有几个MATLAB®创建特定大小和类型的数组的函数,例如的
和0
.用户定义的类可以添加对数组创建函数的支持,而不需要使用重载万博1manbetx方法语法。
类对任何数组万博1manbetx创建函数的支持使您能够开发可以与内置数据类型和用户定义数据类型共享的代码。例如,变量的类x
在下面的代码中,可以是初始开发期间的内置类型,然后被用户定义的透明重载类替换0
:
cls =类(x);zArray = 0 (m, n, cls);
数组创建函数以两种方式创建特定类型的数组:
类名语法——指定确定数组元素类型的类名。
原型对象语法——提供一个原型对象,函数使用它来确定数组元素的类型和其他特征。
例如:
zArray = 0(2、3、“uint8”);
P = uint8([1 3 5;2 4 6]);zArray = 0(2、3、“喜欢”, p);
将对这些函数的支持添加到名万博1manbetx为MyClass
,你可以对该类使用类似的语法:
zArray = 0(2、3、“MyClass”);
或者传递一个类的对象:
p = MyClass(…);zArray = 0(大小(p),“喜欢”, p);
MATLAB使用这些参数来分派到类中的适当方法。
下面的函数支持这种重载。万博1manbetx
若要创建默认对象数组(构造函数不需要输入参数),请使用类名语法。
若要创建具有特定属性值的对象数组,或如果构造函数需要其他输入,请使用原型对象提供此信息。
类可以同时支持类名和原型万博1manbetx对象语法。
属性可以实现类名语法真正的
和假
函数,尽管这些函数在默认情况下不支持该语法。万博1manbetx
如果您的类实现了类名语法,但没有为特定函数实现原型对象语法,您仍然可以同时调用这两种语法。例如,如果你实现一个静态0
方法,您可以调用:
0(…“喜欢”MyClass(…))
在调用原型对象语法的情况下,MATLAB首先搜索名为zerosLike
.如果MATLAB找不到此方法,则调用0
静态方法。
如果您只需要类名来创建数组,则此特性非常有用。您不需要同时实现这两种方法来支持完整的数组创建函数语法。万博1manbetx当只实现类名语法时,对原型对象语法的调用与对类名语法的调用是相同的。
使用两个独立的方法来支持数组创建函数。万博1manbetx一个方法实现类名语法,另一个实现原型对象语法。
例如,支持万博1manbetx0
功能:
实现类名语法:
0(…”类名称')
作为一个静态
方法:
方法(静态)函数Z = 0 (varargin)…结束结束
实现原型对象语法:
0(…“喜欢”obj)
作为一个隐藏的
方法与字符
向量“喜欢”
附加在名称后面。
方法(隐藏)函数z = zerosLike(obj,varargin)…结束结束
对数组创建函数的特殊支持万博1manbetx源于对语法的解释。
给…打电话0
此形式的功能:
0(…'类名称
')
使用以下语法调用类静态方法:
类名称.zeros(变长度输入宗量{1:end-1})
给…打电话0
此形式的功能:
0(…“喜欢”obj)
使用以下语法调用类方法:
zerosLike (obj,变长度输入宗量{1:end-2})
数组创建函数的输入参数可以包括函数返回的数组的维数以及可能的其他参数。通常情况下,你的方法必须支持三种情况:万博1manbetx
没有维度输入参数导致返回标量。例如:
z = 0 (“MyClass”);
等于或小于零的一维或多个维,导致空数组。例如:
z = 0 (2 0“MyClass”);
指定数组大小的任意有效数组维数。例如:
z = 0(2、3、5,“MyClass”);
当数组创建函数调用类方法时,它传递输入参数,不包括类名或文字“喜欢”
以及方法的对象变量。你可以用这些签名来实现你的方法:
0(变长度输入宗量)
用于“类名”方法
0 (obj,变长度输入宗量)
对于“类似原型对象”方法
的颜色
类表示特定颜色空间中的颜色,例如:RGB
,HSV
,等等。的讨论类名方法实现和原型对象方法实现使用这个类作为重载方法实现的基础。
classdef颜色属性= [0,0,0] [0,0,0“RGB”结束方法函数obj =颜色(cSpace、价值观)如果Nargin > 0 obj。色彩= cSpace; obj.ColorValues = values;结束结束结束结束
的0
函数去掉final类名称
字符
对象中的静态方法的调用颜色
类。传递给静态方法的参数是数组维度参数。
这是一个实现0
方法颜色
类。这个实现:
定义了0
方法静态
(必需)
返回一个标量颜色
对象,如果调用0
没有维度参数
如果调用,则返回空数组0
任何维度参数都等于0。
返回一个默认数组颜色
对象。使用repmat
要创建由调用指定的维度的数组0
.
classdef颜色...方法(静态)函数z = 0(变长度输入宗量)如果(输入参数个数= = 0)% 0(颜色)z =颜色;elseif任何([变长度输入宗量{}):< = 0)%用于任何维度<= 0的零z = Color.empty(变长度输入宗量{:});其他的% 0 (m, n,…,“颜色”)%使用属性默认值z = repmat(颜色、变长度输入宗量{:});结束结束结束结束
的0
方法使用默认值ColorValues
属性,因为这些值适合于此应用程序。的实现的
方法可以设置ColorValues
财产(1, 1, 1)
为例。
假设你想重载兰迪
功能实现以下目标:
定义每个ColorValue
属性为1 × 3数组,范围为1到指定的最大值(例如,1- 255)。
容纳标量、空数组和多维数组大小。
返回颜色
对象的指定尺寸,每个随机ColorValues
.
classdef颜色...方法(静态)函数r =兰迪(变长度输入宗量)如果(输入参数个数= = 0)兰迪%('名称')r =颜色(“RGB”兰迪(255年,[1,3]));elseif任何([变长度输入宗量{2}结束):< = 0)% For randi with any dimension <= 0r = Color.empty(变长度输入宗量{2:结束});其他的兰迪% (max, m, n,…,“名称”)如果Numel ([varargin{:}]) < 2错误('输入参数不足')结束dim =[变长度输入宗量{2}结束):;r = 0(变暗,“颜色”);为k = 1:prod(dims) r(k) = Color(“RGB”兰迪(变长度输入宗量{1},[1,3]));结束结束结束结束结束
返回“类似于原型对象”的对象数组的方法的目标取决于类的需求。为颜色
类,zeroLike
方法创建具有色彩
属性的值,但是ColorValues
都是零。
这是一个实现zerosLike
方法颜色
类。这个实现:
定义了zerosLike
方法隐藏的
返回一个标量颜色
对象的调用0
函数没有维度参数
的调用将返回一个空数组0
函数具有任何为负或等于0的维参数。
返回颜色
的调用指定的维度的对象0
函数。
classdef颜色...方法(隐藏)函数z = zerosLike (obj,变长度输入宗量)如果输入参数个数= = 1%为0(‘喜欢’,obj)cSpace = obj.ColorSpace;z =颜色;z.ColorSpace = cSpace;elseif任何([变长度输入宗量{}):< = 0)%用于任何维度<= 0的零z = Color.empty(变长度输入宗量{:});其他的% 0 (m, n,…,“喜欢”,obj)如果~ isscalar (obj)错误('Prototype对象必须是标量')结束obj =颜色(obj。色彩,0(1,3,“喜欢”obj.ColorValues));z = repmat (obj,变长度输入宗量{:});结束结束结束结束
这是颜色
使用重载方法的类定义。
请注意
在实际操作中颜色
类需要错误检查、颜色空间转换等。这个过于简化的版本演示了重载方法的实现。
classdef颜色属性= [0,0,0] [0,0,0“RGB”结束方法函数obj =颜色(cSpace、价值观)如果Nargin > 0 obj。色彩= cSpace; obj.ColorValues = values;结束结束结束方法(静态)函数z = 0(变长度输入宗量)如果(输入参数个数= = 0)% 0('名称')z =颜色;elseif任何([变长度输入宗量{}):< = 0)%用于任何维度<= 0的零z = Color.empty(变长度输入宗量{:});其他的% 0 (m, n,…,“名称”)%使用属性默认值z = repmat(颜色、变长度输入宗量{:});结束结束函数r =兰迪(变长度输入宗量)如果(输入参数个数= = 0)兰迪%('名称')r =颜色(“RGB”兰迪(255年,[1,3]));elseif任何([变长度输入宗量{2}结束):< = 0)% For randi with any dimension <= 0r = Color.empty(变长度输入宗量{2:结束});其他的兰迪% (max, m, n,…,“名称”)如果Numel ([varargin{:}]) < 2错误('输入参数不足')结束dim =[变长度输入宗量{2}结束):;r = 0(变暗,“颜色”);为k = 1:prod(dims) r(k) = Color(“RGB”兰迪(变长度输入宗量{1},[1,3]));结束结束结束结束方法(隐藏)函数z = zerosLike (obj,变长度输入宗量)如果输入参数个数= = 1%为0(‘喜欢’,obj)cSpace = obj.ColorSpace;z =颜色;z.ColorSpace = cSpace;elseif任何([变长度输入宗量{}):< = 0)%用于任何维度<= 0的零z = Color.empty(变长度输入宗量{:});其他的% 0 (m, n,…,“喜欢”,obj)如果~ isscalar (obj)错误('Prototype对象必须是标量')结束obj =颜色(obj。色彩,0(1,3,“喜欢”obj.ColorValues));z = repmat (obj,变长度输入宗量{:});结束结束结束结束