Arrays 为自定义类使用空数组分配

Arrays 为自定义类使用空数组分配,arrays,matlab,oop,allocation,Arrays,Matlab,Oop,Allocation,比如说,我们有一辆classCar classdef Car < handle properties wheels = 4; end methods function obj = Car() end end end 然而,你可以先制造一个空的汽车阵列 >> cars = Car.empty(0,10) cars = 0x10 Car array with properties:

比如说,我们有一辆class
Car

classdef Car < handle
    properties
        wheels = 4;
    end
    methods
        function obj = Car()
        end
    end
end
然而,你可以先制造一个空的汽车阵列

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

cars = 

  0x10 Car array with properties:

    wheels
我不明白的是:如果现在把一辆车放进去,数组似乎缩小到一个元素

>> cars(1) = Car

cars = 

  Car with properties:

    wheels: 4

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

这不是一个与对象编程相关的问题,而是一个在Matlab中更为普遍的正常行为

例如:

>> a = NaN(0,10);
>> a(1) = 5;
>> a
a =
    5 
a = NaN(0,2);
for i = 1:10
    a(end+1,:) = [i i^2];
end
当您定义一个大小为0xn的数组时,Matlab不会为其分配任何内存,因为没有元素。因此,调用
empty(0,10)
不应被视为预分配

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

empty
语法有助于定义一个数组,该数组将由循环中使用
end+1
语法的聚合填充,例如:

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

最好,

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

>> a = double.empty(0,10)
a =
   Empty matrix: 0-by-10
所以你的问题是

我不明白的是:如果现在把一辆车放进去,数组似乎缩小到一个元素

>> cars(1) = Car

cars = 

  Car with properties:

    wheels: 4
不,它已经成长为一个单一的元素。我想这里有一个模糊的地方,你可能会期望它不是成长为1x1数组,而是成长为1x10数组,其他九个没有直接赋值的元素被设置为默认值(即,对于双精度或其他数字为零,对于自定义类为默认元素)。然而,我认为唯一要说的是,这不是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语法,用于删除行,而不是直接构造空数组,然后分配它。因此这里还有另一个用例,即防止意外删除行。

您的上一个示例实际上没有使用
empty
方法-即使
a
被预先分配为
NaN(0,0)
,它的工作原理也完全相同。此外,最好的做法是预先将其分配给
NaN(10,2)
,然后用
a(i,:)=
填充它。因此,尽管我知道你在说什么,但我不确定它是否真的按照问题的要求演示了
empty
的用例。所以
.empty(1,numel(x))
可以被一个简单的
.empty()
替换,就像我慢慢理解的那样,MATLAB支持索引空字段,对吗?所以一个对象数组就像一个链表,没有什么比预分配更好的了,我想我不知道你是怎么从我的答案中得到这些想法的。首先,
.empty(1,N)
将出错,除非
N
为零,因此它很少等价于
.empty()
。其次,虽然我不确定“索引空字段”是什么意思,
empty
不是字段,而是所有类的静态方法,它创建类的空数组(各种空维度,例如0x0、0x10、2x3x0x4x5)。对象数组实际上与链表不同,您完全可以预先分配数组。但也许你所说的“预分配”对我来说意味着不同的东西。