用于自定义类的空数组分配

时间:2015-02-06 04:24:11

标签: arrays matlab oop allocation

说,我们有一个班级Car

classdef Car < handle
    properties
        wheels = 4;
    end
    methods
        function obj = Car()
        end
    end
end

我们可以创造十辆这样的汽车

cars = Car.empty();

for ii = 1:10
    cars(end+1) = Car;
end

然而,人们可以先制作一个空车阵列

>> cars = Car.empty(0,10)

cars = 

  0x10 Car array with properties:

    wheels

我不明白:如果现在有一辆车,那么阵列似乎缩小为一个元素

>> cars(1) = Car

cars = 

  Car with properties:

    wheels: 4

那么,确实分配这样一个空数组有意义吗?有什么用例?

2 个答案:

答案 0 :(得分:1)

首先,请注意您的问题与自定义类没有直接关系 - 您可以使用任何MATLAB变量类型执行此操作。例如,

>> a = double.empty(0,10)
a =
   Empty matrix: 0-by-10

所以你的问题是

  

我不明白:如果现在有一辆车,那么阵列似乎缩小为一个元素

嗯不,它成长到一个元素。我想这里有一个含糊不清的地方,你可能会期望它不会增长到1x1阵列而是增加到1x10阵列,其他9个未直接分配的元素被设置为默认值(即双倍的情况下为零)或其他数字,或自定义类的默认元素)。但是,我认为唯一可以说这不是MATLAB所做的。

  

分配这样一个空数组有什么意义吗?有什么用例?

一般情况下,用例非常少,实际上只是边缘情况。具有零长度维度的数组的能力显然需要保持一致性,但0x10的数组在行为上与0x0的数组很少不同。

如果我的数组高度可能不同但总是10宽,我可能会将其预定义为0x10而不是0x0,只是为了让自己在这个事实的代码中提醒一下。

另请注意,[]double.empty(0,0)之间的行为存在差异。例如

>> a = rand(4,2)
a =
      0.83625      0.19468
      0.58508      0.12698
      0.44332       0.8509
      0.51858       0.3673
>> a(2,:) = []
a =
      0.83625      0.19468
      0.44332       0.8509
      0.51858       0.3673
>> a(2,:) = double.empty(0,0)
Subscripted assignment dimension mismatch. 
>> a(2,:) = double.empty(0,2)
Improper assignment with rectangular empty matrix.

这是因为= []是一个特殊的MATLAB语法,用于删除行,而不是字面构造空数组然后分配它。所以那里有另一个用例,即防止意外删除行。

答案 1 :(得分:0)

这不是与对象编程相关的问题,而是在Matlab中更常见的正常行为。

例如:

>> a = NaN(0,10);
>> a(1) = 5;
>> a
a =
    5 

当你定义一个大小为0xn的数组时,Matlab不会为它分配任何内存,因为没有元素。因此,不应将对empty(0,10)的调用视为预分配。

当您定义数组的第一个元素时,强制调整大小,并且在调整大小期间,Matlab始终采用最小可能的数组大小。

empty语法可用于定义一个数组,该数组将在具有end+1语法的循环中通过聚合填充,例如:

a = NaN(0,2);
for i = 1:10
    a(end+1,:) = [i i^2];
end

最佳,