在Matlab中,“cell”(即带有{ }
)和“matrix”(即带有[ ]
)之间有什么区别?
在MATLAB中,cell array和matrix之间有几个区别:
每个单元格中的元素类型可以是任意类型的,而矩阵要求其元素类型是同质的即相同类型。
就内存布局而言,矩阵中的所有元素都是按照连续的方式排列在内存中,而cell array包含对数组中每个元素的指针。这在考虑到高性能代码的缓存局部性时可能很重要。
第2点的反面是,当您调整矩阵的大小时,必须将矩阵中的每个元素复制到新分配的内存区域中,但是在cell array的情况下,只需要复制指针列表。根据您存储的元素的大小和类型,这可能意味着cell数组的调整大小速度更快。
为了说明内存布局上的差异,让我们考虑一个简单的例子:
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 的 1x1 矩阵,并将其赋值给第一个单元数组元素。这里的过程类似于我上面描述的创建 1x4 矩阵的过程,只是分配的内存只足够容纳一个 double(8 个字节)。对于剩余的三个语句也是如此。所以,至少,第二个示例使用了 16 + 8 x 4 = 48
个字节。
请注意,MATLAB 中的每个变量还包括用于存储有关该变量的维度、数据类型等信息的结构体 mxArray 的内存开销。出于简单起见,我忽略了这个开销。
mxArray
中的具体实现方式。我们只知道它们在内部带有一些开销。Matlab 会告诉你关于开销的一些信息:输入a = []; c = {a}; whos
命令,Matlab 将会报告 c 变量所使用的字节数。我认为这大约是每个 mxArray 所带来的开销。 - Andrew Jankewhos
建议的每个mxarray开销来近似。 - Andrew Janke