Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

创建和初始化对象数组

您可以创建由基于类的对象组成的数组,其索引行为类似于内置类型,如 doublestring。然而,创建对象数组需要特别注意对象是如何构造的。

使用循环创建对象数组

定义类 SimpleValue,它有一个具有初始值的属性和默认的无参数参数构造函数。

classdef SimpleValue
   properties
      prop1 = 0
   end
end

使用循环创建一个由 SimpleValue 对象组成的数组。

for k = 1:5
   objArray(k) = SimpleValue;
end

使用数组索引引用特定对象的属性并对其进行赋值。例如,将值 5 赋给 objArray(1)prop1 属性。

objArray(1).prop1 = 5;

返回所有对象的 prop1 的值并将它们赋给一个向量。

p = [objArray.prop1]
p =

     5     0     0     0     0

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

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

SimpleValue 示例中,objArray 中的对象是以循环方式使用默认的无参数构造函数和初始属性值创建的。您还可以通过构造数组的最后一个元素来创建一个 SimpleValue 对象数组。

例如,创建一个由 SimpleValue 对象组成的 2×2 数组。

a(2,2) = SimpleValue
a = 

  2×2 SimpleValue array with properties:

    prop1

当您以这种方式创建一个对象数组时,MATLAB® 会采用以下两种方法之一来填充该数组的其余元素,具体取决于类是值还是句柄。

值类数组

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

  • 调用一次无参数构造函数

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

如果要使用构造函数的输入来初始化属性值,您还必须在构造函数中有一个无参数选项。

例如,向 SimpleValue 添加一个构造函数,该构造函数接受输入并将该输入赋给 prop1

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

通过用输入参数 7 构造 b(5) 来创建一个 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 会执行以下操作:

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

  • 从数组中的最后一个对象复制属性值

  • 使用这些复制的值为数组的其余部分创建对象,而不调用构造函数

与值类的情况不同,MATLAB 不会调用构造函数来填充数组,因此该数组中的所有对象都以相同的属性值开头。例如,定义一个为其属性生成随机数的句柄类。

classdef InitHandleArray < handle
   properties
      RandNum
   end
   methods
      function obj = InitHandleArray
         obj.RandNum = randi(100);
      end
   end
end

通过构造 c(5) 创建一个新的 1×5 数组,并验证 prop1 值。为了创建该数组,MATLAB 会调用构造函数两次。第一次调用时,MATLAB 对 c(5).RandNum 赋值。第二次调用时,它将调用的结果赋给 randi 来创建 c(1)。最后,它将该 RandNum 值复制到 c 中的其余元素。

c(5) = InitHandleArray;
z = [c.RandNum]
z =

    91    91    91    91    82

尽管 MATLAB 不需要在构造函数中使用无参数选项来创建句柄类数组,但对于所有类构造函数来说,仍然推荐使用无参数选项。

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

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

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

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

相关主题