创建和初始化对象数组
MATLAB® 提供了创建对象数组的不同方法。这些不同方法在如何创建数组中的对象方面有所不同。根据您的最终目标选择一种数组创建方法:
使用循环创建对象数组 - 当需要使用不同值初始化对象时,使用 for 循环创建数组。
使用 createArray (自 R2024a 起) 创建对象数组 - 使用
createArray
(自 R2024a 起) 创建具有相同初始值的对象数组。通过构造最后一个元素创建对象数组 - 当您只想构造数组中的元素时使用。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
。使用 Like
和 phi
创建该类的 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
值,并将它们赋给向量 y
。b(5)
中对象的 prop1
值为 7
。MATLAB 会调用一次无参量构造函数,并将值复制到数组中其余的所有元素。这些元素的默认 prop1
值为 0
。
y = [b.prop1]
y = 0 0 0 0 7
如果 SimpleValue
构造函数无法处理无参量调用,则 MATLAB 在尝试填充 b(1)
到 b(4)
时会出错。
句柄类数组
在构造由句柄类对象组成的数组中的最后一个元素后,MATLAB 会执行以下操作:
为数组的每个元素创建唯一句柄
调用无参量构造函数
用该实例的副本填充其余元素
通过构造输入参量为 3
的 c(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
只要包含了无参量选项,此构造函数模式就既适用于值对象,也适用于句柄对象。