主要内容

类支持数组创金宝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个标量(或1×1稀疏矩阵):

对于这些函数,您不需要指定特定类型的大小在创建标量。例如:

d =每股收益(“单一”);
单([p = 1 3 5;2 4 6]);d =每股收益(“喜欢”,p);

添加后对这些功能的支持一个金宝app用户定义的类,您可以使用类似的语法类。

使用哪个语法

创建默认对象数组,它不需要输入参数的构造函数,然后使用类名称的语法。

创建一个数组对象的特定属性值或如果构造函数需要其他投入,使用原型对象来提供这些信息。

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

您可以实现一个类名与语法真正的功能即使这些功能不支持默认语法的。金宝app

类名名为如果原型方法的方法并不存在

如果你的类实现类名称的语法,但没有实现一个原型对象语法对于一个特定的函数,你可以调用语法。例如,如果您实现一个静态的0方法,您可以调用:

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

对于你所说的原型对象语法,MATLAB首先搜索方法zerosLike。如果MATLAB不能找到这种方法,它要求0静态方法。

这个功能是非常有用的,如果你只需要类名创建数组。你不需要实现两种方法来支持完整的数组创建函数的语法。金宝app当你实现类名称的语法,调用一个原型对象语法是一样的调用类名称的语法。

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

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

例如,支持金宝app0功能:

  • 实现类名称的语法:

    0 (…”类名称”)

    作为一个静态方法:

    方法(静态)函数z = 0(变长度输入宗量)结束结束
  • 实现原型对象的语法:

    0(…,“喜欢”,obj)

    作为一个隐藏的方法与字符向量“喜欢”附加到这个名字。

    方法(隐藏)函数z = zerosLike (obj,变长度输入宗量)结束结束

如何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颜色属性ColorValues =(0, 0, 0)色彩=“RGB”结束方法函数obj =颜色(cSpace、价值观)如果输入参数个数> 0 obj。色彩= cSpace; obj.ColorValues = values;结束结束结束结束

类名方法实现

0函数带最后类名称字符向量和用它来调用静态方法的形式颜色类。传递到静态方法的参数是数组的尺寸参数。

这是一个实现的0方法颜色类。这个实现:

  • 定义了0方法静态(必需)

  • 返回一个标量颜色如果调用对象0没有尺寸参数

  • 如果调用返回一个空数组0有任何尺寸参数等于0。

  • 返回一个数组的默认值颜色对象。使用repmat创建一个数组调用指定的尺寸0

classdef颜色方法(静态)函数z = 0(变长度输入宗量)如果(输入参数个数= = 0)% 0(颜色)z =颜色;elseif任何([变长度输入宗量{}):< = 0)%与任何维度< 0 = 0z = 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)%为兰迪与任何维度< = 0r = Color.empty(变长度输入宗量{2:结束});其他的兰迪% (max, m, n,…,“名称”)如果元素个数([变长度输入宗量{:}])< 2错误(没有足够的输入参数的)结束dim =[变长度输入宗量{2}结束):;r = 0(变暗,“颜色”);k = 1:刺激(dim) r (k) =颜色(“RGB”兰迪(变长度输入宗量{1},[1,3]));结束结束结束结束结束

原型对象方法实现

客观的方法,该方法返回一个数组对象“像一个原型对象”取决于类的需求。为颜色类,zeroLike创建对象的方法色彩原型对象的属性值,但是ColorValues都是零。

这是一个实现的zerosLike方法颜色类。这个实现:

  • 定义了zerosLike方法隐藏的

  • 返回一个标量颜色如果调用对象0函数没有尺寸参数

  • 如果调用返回一个空数组0函数的任何尺寸参数-或等于0。

  • 返回一个数组的颜色的对象的调用指定的尺寸0函数。

classdef颜色方法(隐藏)函数z = zerosLike (obj,变长度输入宗量)如果输入参数个数= = 1%为0(‘喜欢’,obj)cSpace = obj.ColorSpace;z =颜色;z。色彩= cSpace;elseif任何([变长度输入宗量{}):< = 0)%与任何维度< 0 = 0z = Color.empty(变长度输入宗量{:});其他的% 0 (m, n,…,“喜欢”,obj)如果~ isscalar (obj)错误(“必须标量原型对象”)结束obj =颜色(obj.ColorSpace 0 (1、3、“喜欢”obj.ColorValues));z = repmat (obj,变长度输入宗量{:});结束结束结束结束

完整的类清单

这是颜色类定义重载方法。

请注意

在实际操作当中,颜色类需要错误检查、颜色空间转换,等等。这个简化的版本说明了重载方法的实现。

classdef颜色属性ColorValues =(0, 0, 0)色彩=“RGB”结束方法函数obj =颜色(cSpace、价值观)如果输入参数个数> 0 obj。色彩= cSpace; obj.ColorValues = values;结束结束结束方法(静态)函数z = 0(变长度输入宗量)如果(输入参数个数= = 0)% 0('名称')z =颜色;elseif任何([变长度输入宗量{}):< = 0)%与任何维度< 0 = 0z = Color.empty(变长度输入宗量{:});其他的% 0 (m, n,…,“名称”)%使用属性的默认值z = repmat(颜色、变长度输入宗量{:});结束结束函数r =兰迪(变长度输入宗量)如果(输入参数个数= = 0)兰迪%('名称')r =颜色(“RGB”兰迪(255年,[1,3]));elseif任何([变长度输入宗量{2}结束):< = 0)%为兰迪与任何维度< = 0r = Color.empty(变长度输入宗量{2:结束});其他的兰迪% (max, m, n,…,“名称”)如果元素个数([变长度输入宗量{:}])< 2错误(没有足够的输入参数的)结束dim =[变长度输入宗量{2}结束):;r = 0(变暗,“颜色”);k = 1:刺激(dim) r (k) =颜色(“RGB”兰迪(变长度输入宗量{1},[1,3]));结束结束结束结束方法(隐藏)函数z = zerosLike (obj,变长度输入宗量)如果输入参数个数= = 1%为0(‘喜欢’,obj)cSpace = obj.ColorSpace;z =颜色;z。色彩= cSpace;elseif任何([变长度输入宗量{}):< = 0)%与任何维度< 0 = 0z = Color.empty(变长度输入宗量{:});其他的% 0 (m, n,…,“喜欢”,obj)如果~ isscalar (obj)错误(“必须标量原型对象”)结束obj =颜色(obj.ColorSpace 0 (1、3、“喜欢”obj.ColorValues));z = repmat (obj,变长度输入宗量{:});结束结束结束结束

相关的话题