主要内容

类支持数组创金宝app建函数

扩展类的数组创建函数

有几个MATLAB®创建特定大小和类型的数组的函数,例如0.用户定义的类可以添加对数组创建函数的支持,而不需要使用重载金宝app方法语法。

类对任何数组金宝app创建函数的支持使您能够开发可以与内置数据类型和用户定义数据类型共享的代码。例如,变量的类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);

将对这些函数的支持添加到名金宝app为MyClass,你可以对该类使用类似的语法:

zArray = 0(2、3、“MyClass”);

或者传递一个类的对象:

p = MyClass(…);zArray = 0(大小(p),“喜欢”, p);

MATLAB使用这些参数来分派到类中的适当方法。

支持重载的数组创建函数金宝app

下面的函数支持这种重载。金宝app

数组创建函数
0
眼睛
(小写)
真正的
兰德
randn
兰迪

使用哪种语法

若要创建默认对象数组(构造函数不需要输入参数),请使用类名语法。

若要创建具有特定属性值的对象数组,或如果构造函数需要其他输入,请使用原型对象提供此信息。

类可以同时支持类名和原型金宝app对象语法。

属性可以实现类名语法真正的函数,尽管这些函数在默认情况下不支持该语法。金宝app

如果原型方法不存在,则调用类名方法

如果您的类实现了类名语法,但没有为特定函数实现原型对象语法,您仍然可以同时调用这两种语法。例如,如果你实现一个静态0方法,您可以调用:

0(…“喜欢”MyClass(…))

在调用原型对象语法的情况下,MATLAB首先搜索名为zerosLike.如果MATLAB找不到此方法,则调用0静态方法。

如果您只需要类名来创建数组,则此特性非常有用。您不需要同时实现这两种方法来支持完整的数组创建函数语法。金宝app当只实现类名语法时,对原型对象语法的调用与对类名语法的调用是相同的。

实现对数组创建函数的金宝app支持

使用两个独立的方法来支持数组创建函数。金宝app一个方法实现类名语法,另一个实现原型对象语法。

例如,支持金宝app0功能:

  • 实现类名语法:

    0(…”类名称')

    作为一个静态方法:

    方法(静态)函数Z = 0 (varargin)…结束结束
  • 实现原型对象语法:

    0(…“喜欢”obj)

    作为一个隐藏的方法与字符向量“喜欢”附加在名称后面。

    方法(隐藏)函数z = zerosLike(obj,varargin)…结束结束

如何MATLAB解释函数调用

对数组创建函数的特殊支持金宝app源于对语法的解释。

  • 给…打电话0此形式的功能:

    0(…类名称

    使用以下语法调用类静态方法:

    类名称.zeros(变长度输入宗量{1:end-1})
  • 给…打电话0此形式的功能:

    0(…“喜欢”obj)

    使用以下语法调用类方法:

    zerosLike (obj,变长度输入宗量{1:end-2})

金宝app支持所有功能输入

数组创建函数的输入参数可以包括函数返回的数组的维数以及可能的其他参数。通常情况下,你的方法必须支持三种情况:金宝app

  • 没有维度输入参数导致返回标量。例如:

    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,变长度输入宗量{:});结束结束结束结束

相关的话题