如何在MATLAB中使用size()正确初始化多维对象数组?

时间:2017-02-06 15:08:11

标签: arrays matlab multidimensional-array

我正在尝试初始化一个对象数组。

MATLAB documentation 12,我知道你将最后一个数组元素分配给一个对象,并且数组的其余部分应该填充默认的构造对象。 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的大小不同?

问题是否有构造函数?

1 个答案:

答案 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));