29

Matlab中的单元格(即带有{ })和矩阵(即带有)有什么区别?[ ]

4

1 回答 1

34

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 的 1x1 矩阵,并将其分配给第一个元胞数组元素。这里的过程类似于我上面描述的创建 1x4 矩阵的过程,除了分配的内存仅大到足以容纳一个双精度数(8 字节)。对其余 3 个语句中的每一个重复此操作。因此,第二个示例至少使用16 + 8 x 4 = 48字节。

请注意,MATLAB 中的每个变量还包括一个称为mxArray的结构的内存开销,该结构存储诸如维度、数据类型和有关该变量的更多信息。为了简单起见,我忽略了这个开销。

于 2012-10-21T18:56:47.127 回答