Arrays 为自定义类使用空数组分配
比如说,我们有一辆classArrays 为自定义类使用空数组分配,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:
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)。对象数组实际上与链表不同,您完全可以预先分配数组。但也许你所说的“预分配”对我来说意味着不同的东西。