在MATLAB中,单元格数组和矩阵之间存在一些差异:
>单元格数组可以在每个单元格中包含任意类型的元素;而矩阵要求其元素的类型是同质的,即相同类型。
>就内存布局而言,矩阵的所有元素都在内存中连续布局,而单元格数组包含指向数组中每个元素的指针。在考虑高性能代码的缓存局部性等问题时,这一点非常重要。
>第2点的另一面是当你调整矩阵的大小时,必须将矩阵中的每个元素复制到新分配的内存区域,但是在单元格数组的情况下,只需要复制指针列表。根据您要存储的元素的大小和类型,这可能意味着单元格数组的调整速度要快得多。
为了说明内存布局的差异,让我们考虑一个简单的例子:
A = [10 20 30 40];
这里MATLAB创建一个名为A的新矩阵变量,分配足够的内存来容纳4个双精度数(32个字节,假设8个字节为双精度)并将此内存分配给指向A的实部的指针。(如果创建复数矩阵数字,也为虚部分配存储器,并且单独的指针指向该存储区域)。
现在让我们创建一个包含这些元素的单元格数组:
B = cell(1, 4);
B{1,1} = 10;
B{1,2} = 20;
B{1,3} = 30;
B{1,4} = 40;
当MATLAB执行第一个语句时,它会创建一个包含4个指针的单元格数组,每个指针都指向一个任意类型。所以B已经使用了16个字节(假设是32位指针)。
下一行创建一个包含值10的1×1矩阵,并将其分配给第一个单元数组元素。这里的过程类似于我上面描述的用于创建1×4矩阵的过程,除了分配的内存大到足以容纳一个双(8字节)。对于剩余的3个语句中的每个语句重复此操作。因此,在最低限度,第二个示例使用16 8 x 4 = 48字节。
请注意,MATLAB中的每个变量还包括一个名为mxArray的结构的内存开销,该结构存储诸如维度,数据类型等信息以及关于该变量的更多信息。为简单起见,我忽略了这种开销。