【问题标题】:How do I initialize a multidimensional object array using size() in MATLAB correctly?如何在 MATLAB 中正确使用 size() 初始化多维对象数组?
【发布时间】:2017-02-06 15:08:11
【问题描述】:

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

MATLAB documentation 12,我知道您将最后一个数组元素分配给了一个对象,而数组的其余部分应该用默认构造的对象填充。例如

object_array(2,2) = object; % create 2 x 2 of class 'object'

我在我的代码中的几个地方都这样做了,而且效果很好。

但我发现对于我的一门课它不起作用。

我有一个大小为 1x2x2 的 objA 对象数组,我想创建一个大小为 objB 的对象数组。现在 objB 有一个构造函数,所以我确保构造函数处理构造函数没有参数的情况,以便 objB 的对象数组可以默认填充。例如

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 的大小不一样?

问题出在构造函数上吗?

【问题讨论】:

    标签: arrays matlab multidimensional-array


    【解决方案1】:

    size(objAArray) 是一个向量,MATLAB 将其视为赋值索引。由于size(objAArray)[1 2 2]objBArray(size(objArray)) = objB 将简单地在现有objBArray 数组的元素1、2 和2 中放置对objB 的引用。由于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
    

    为此,您需要使用num2cellsize(objAArray) 转换为元胞数组,并使用{:} 索引生成一个逗号分隔的列表以用作下标,因为您希望向量的每个条目作为分配的单独下标

    inds = num2cell(size(objAArray));
    objBArray(inds{:}) = objB;
    

    或者,您可以使用repmat 使用默认构造函数获得的对象来初始化objBArray

    objBArray = repmat(objB(), size(objAArray));
    

    【讨论】:

    • 如果我通过句柄类 objB 使用 repmat,数组中的每个对象会指向相同的数据还是独立对象?
    • @SamJones 不幸的是,它们都是同一个默认对象。
    • 据我了解,使用 inds 下标方法将引用不同的数据对象,正如我从 documentation 所了解的那样。
    猜你喜欢
    • 1970-01-01
    • 2016-09-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    相关资源
    最近更新 更多