我正在尝试初始化一个对象数组。
从MATLAB documentation 1和2,我知道你将最后一个数组元素分配给一个对象,并且数组的其余部分应该填充默认的构造对象。 e.g。
object_array(2,2) = object; % create 2 x 2 of class 'object'
我已经在我的代码中的几个地方完成了这项工作并且工作正常。
但我发现,对于我的一个课程,它不起作用。
我有一个大小为1x2x2的objA对象数组,我想创建一个大小为objB的对象数组。现在objB有一个构造函数,所以我确保构造函数处理构造函数没有参数的情况,这样objB的对象数组可以默认填充。 e.g。
function objb = objB(parameter)
if (nargin > 0)
% do stuff with parameter
end
end
现在这里有趣的部分: 我尝试使用objA数组的大小构造objB对象数组。
# breakpoint 1
objBArray(size(objAArray)) = objB;
# breakpoint 2
当我到达断点1 时,
size(objAArray) = 1, 2, 2
但是当我到达断点2 时,
size(objAArray) = 1, 2, 2
和
size(objBArray) = 1, 2
为什么objBArray与objAArray的大小不同?
问题是否有构造函数?
答案 0 :(得分:1)
size(objAArray)
是一个向量,MATLAB将其视为赋值的索引。由于size(objAArray)
为[1 2 2]
,objBArray(size(objArray)) = objB
只会在现有objB
数组的元素1,2和2中放置对objBArray
的引用。由于objBArray
尚不存在,MATLAB将产生1 x 2对象数组,就像正常数字一样
a([1 2 2]) = 3;
% 3 3
size(a)
% 1 2
实际想要的是
a(1,2,2) = 3; % Instead of a([1 2 2]) = 3
要完成此操作,您需要使用size(objAArray)
将num2cell
转换为单元格数组并使用{:}
索引生成逗号分隔列表以用作下标,因为您需要向量的每个条目作为分配的单独下标
inds = num2cell(size(objAArray));
objBArray(inds{:}) = objB;
或者,您可以使用repmat
使用默认构造函数获取的对象初始化objBArray
。
objBArray = repmat(objB(), size(objAArray));