说,我们有一个班级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
那么,确实分配这样一个空数组有意义吗?有什么用例?
答案 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
最佳,