Main Content

创建和初始化对象数组

MATLAB® 提供了创建对象数组的不同方法。这些不同方法在如何创建数组中的对象方面有所不同。根据您的最终目标选择一种数组创建方法:

使用循环创建对象数组

定义类 SimpleValue,该类有一个带有默认值的属性和一个可以不带参量调用的构造函数。

classdef SimpleValue
   properties
      prop1 = 0
   end
   methods
      function obj = SimpleValue(v)
         if nargin > 0
            obj.prop1 = v;
         end
      end
   end
end

使用循环创建一个由 SimpleValue 对象组成的数组。将数组中每个元素的值 prop1 设置为不同值。

initValues = [3 -1 0 4 5];
for k = 1:5
   objArray(k) = SimpleValue(initValues(k));
end

验证 prop1 的值是否设置为 initValues

p = [objArray.prop1]
p =

     3    -1     0     4     5

有关访问对象数组的属性和方法的详细信息,请参阅Accessing Properties and Methods in Object Arrays

使用 createArray (自 R2024a 起) 创建对象数组

您还可以使用 createArray 生成您的类的对象数组。createArray 使您能够指定数组的大小以及类、原型和填充值的组合,以生成对象数组。有关语法和选项的完整描述,请参阅 createArray

classname 参量

使用 classname 参量指定数组的类:

X = createArray(dims,"classname")

使用循环创建对象数组 创建一个 SimpleValue 类的 1×5 数组。MATLAB 不带参量调用构造函数一次,并用该实例的副本填充数组。

X = createArray(1,5,"SimpleValue")
X = 

  1×5 SimpleValue array with properties:

    prop1

数组的所有元素中 prop1 的值是由类定义的默认值。

[X.prop1]
ans =

     0     0     0     0     0

Like 参量

使用 Like 名称-值参量以现有实例或数组为原型创建对象数组:

X = createArray(dims,Like=prototype)

创建 SimpleValue 的实例 phi,并将 1.618 赋给 prop1。使用 Likephi 创建该类的 2×2 对象数组。返回的数组 L 具有与 phi 相同的类。

phi = SimpleValue(1.618);
L = createArray(2,2,Like=phi)
L = 

  2×2 SimpleValue array with properties:

    prop1

Like 结合使用的 createArray 不保留 phi 的属性值,因为它不使用原型的副本来填充数组。L 中的元素是对原型类的默认构造函数的一次调用的副本,因此它们具有 prop1 的默认值。

[L.prop1]
ans =

     0     0     0     0

FillValue 参量

要创建包含非默认对象的数组,请使用构造函数的输入参量创建一个实例,然后将其用作 createArray 的填充值:

X = createArray(dims,FillValue=instance)

创建一个 SimpleValue 的实例,将 7 赋给 prop1,并使用该实例和 FillValue 名称-值参量创建一个 3×1 数组。

s = SimpleValue(7);
F = createArray(3,1,FillValue=s)
F = 

  3×1 SimpleValue array with properties:

    prop1
与指定 classname 的情况不同,createArray 在指定填充值时不会调用类构造函数。填充值被复制到数组的每个元素。验证每个实例的 prop1 的值是否为 7

[F.prop1]
ans =

     7     7     7

句柄类

前几节主要讨论值类。对于句柄类,createArray 为数组的每个元素创建唯一句柄。例如,使用一个构造函数定义句柄类,该构造函数为类属性生成一个随机数。

classdef InitHandleArray < handle
    properties
        Num
    end
    methods
        function obj = InitHandleArray(varargin)
            if nargin == 1
                obj.Num = randi(varargin{1});
            else
                obj.Num = -4;
            end
        end
    end
end

使用 createArray 返回默认 InitHandleArray 对象的 2×2 数组。

Y = createArray(2,2,"InitHandleArray")
Y = 

  2×2 InitHandleArray array with properties:

    Num

尽管句柄是唯一的,MATLAB 只调用构造函数一次,并用该实例的副本填充数组。通过检查属性 Num 的值来验证是否调用了不带参量的构造函数。

 [Y.Num]
ans =

    -4    -4    -4    -4

通过构造最后一个元素创建对象数组

使用循环创建对象数组 中的 SimpleValue 示例中,objArray 中的对象是在循环内创建的。您还可以通过构造数组的最后一个元素来创建一个 SimpleValue 对象数组。

例如,通过构造数组中的最后一个元素来创建一个由 SimpleValue 对象组成的 2×2 数组。

a(2,2) = SimpleValue
a = 

  2×2 SimpleValue array with properties:

    prop1

值类数组

在构造由值类对象组成的数组中的最后一个元素后,MATLAB 会执行以下操作:

  • 调用无参量构造函数

  • 用该实例的副本填充其余元素

通过用输入参量 7 构造 b(5) 来创建一个由 SimpleValue 组成的 1×5 数组。

b(5) = SimpleValue(7);

返回所有 prop1 值,并将它们赋给向量 yb(5) 中对象的 prop1 值为 7。MATLAB 会调用一次无参量构造函数,并将值复制到数组中其余的所有元素。这些元素的默认 prop1 值为 0

y = [b.prop1]
y =

     0     0     0     0     7

如果 SimpleValue 构造函数无法处理无参量调用,则 MATLAB 在尝试填充 b(1)b(4) 时会出错。

句柄类数组

在构造由句柄类对象组成的数组中的最后一个元素后,MATLAB 会执行以下操作:

  • 为数组的每个元素创建唯一句柄

  • 调用无参量构造函数

  • 用该实例的副本填充其余元素

通过构造输入参量为 3c(5),创建一个新的由 InitHandleArray 类组成的 1×5 数组(请参阅句柄类),并验证 Num 的值。MATLAB 再次调用构造函数,并将该调用的结果副本赋给 c(1)c(4)

c(5) = InitHandleArray(3);
z = [c.Num]
z =

    -4    -4    -4    -4     3

在构造函数中创建对象数组

您还可以使用类构造函数本身来创建和返回一个对象数组。例如,ObjectArray 类创建与输入数组 F 大小和形状相同的对象数组。然后,构造函数将每个对象的 Value 属性初始化为对应的输入数组值。

classdef ObjectArray
   properties
      Value
   end
   methods
      function obj = ObjectArray(F)
         if nargin ~= 0
            n = numel(F);
            p(n) = obj;
            for i = 1:n
               p(i) = F(i);
            end
            obj = reshape(p,size(F));
         end
      end
   end
end

只要包含了无参量选项,此构造函数模式就既适用于值对象,也适用于句柄对象。

相关主题