1

我有两个对我来说看起来完全相同的变量,但一个是<double>,另一个是<cell>。在代码中,它们似乎是由cell2mat. 我知道这是一个数据存储的问题,但我只是看不到 and 的区别和cell定义double

4

2 回答 2

5

添加到 nrz 的答案中,值得注意的是,在存储单元数组时会有额外的内存开销。例如,考虑以下代码:

A = 1:5
B = {A}
C = num2cell(A)
whos

产生以下输出:

A =
     1     2     3     4     5


B =    
    [1x5 double]


C = 
    [1]    [2]    [3]    [4]    [5]

  Name      Size            Bytes  Class     Attributes    
  A         1x5                40  double              
  B         1x1               152  cell                
  C         1x5               600  cell                
  • 从第一行可以看出,double 的基本 1×5 向量A在内存中占用 40 个字节(每个 double 占用 8 个字节)。
  • 第二行显示仅A使用单个单元格进行包装以产生B额外的 112 字节。这是 MATLAB 中单个单元的开销。
  • 第三行确认,因为C包含 5 个单元格并占用 (112+8)×5 = 600 字节。
于 2012-12-30T15:51:06.970 回答
4

数组和元胞数组可能是 MATLAB 中最常用的两种数据类型。

一维和二维数组是矩阵,就像数学中的线性代数一样。但是数组也可以是多维(n维)数组,也叫张量,MATLAB称它们为多维数组。此外,MATLAB 不区分标量和数组,也不区分向量和其他矩阵。标量只是 MATLAB 中的 1x1 数组,向量是 MATLAB 中的 Nx1 和 1xN 数组。

一些例子:

MyScalar = 1;
MyHorizVector = [ 1 2 3 ];
MyVertVector = [ 1 2 3 ]';
MyMatrix = [ 1, 2; 3, 4 ];
My4Darray = cat(4, [ 1 2; 3 4], [ 5 6; 7 8 ], [ 9 10; 11 12 ], [ 13 14; 15 16 ]);

class(MyScalar)
ans =
    double

class(MyHorizVector)
ans =
    double

class(MyVertVector)
ans =
    double

class(MyMatrix)
ans =
    double

class(My4Darray)
ans =
    double

因此,所有这 5 个不同数组的类是double,正如class命令所报告的那样。double表示使用的数值精度(双精度)。

元胞数组是一个更抽象的概念。一个元胞数组可以包含一个或多个数组,也可以包含其他类型的非数组变量。单元阵列还可以容纳其他单元阵列,这些单元阵列可以再次容纳单元阵列可以容纳的任何内容。因此,元胞数组也可以递归地存储在另一个数组中。

元胞数组可用于将不同的对象组合成单个变量,例如。被传递给函数或用cellfun. 每个单元阵列由 1 个或多个单元组成。任何数组都可以使用{ }运算符转换为元胞数组,结果是一个 1x1 元胞数组。还有可用mat2cellnum2cell命令。

MyCellArrayContainingMyScalar = { MyScalar };
MyCellArrayContainingMyHorizVector = { MyHorizVector };
MyCellArrayContainingMyCellArrayContainingMyScalar = { MyCellArrayContainingMyScalar };

上面创建的所有元胞数组都是 1x1 元胞数组。

class(MyCellArrayContainingMyScalar)
ans =
    cell

class(MyCellArrayContainingMyHorizVector)
ans =
    cell

class(MyCellArrayContainingMyCellArrayContainingMyScalar)
ans =
    cell

但并非所有元胞数组都可以使用 转换为矩阵cell2mat,因为单个元胞数组可以包含多个不同的数据类型,这些数据类型不能存在于同一个数组中。

这些确实有效:

cell2mat(MyCellArrayContainingMyScalar)
ans =
    1

cell2mat(MyCellArrayContainingMyHorizVector)
ans =
    1     2     3

但这失败了:

cell2mat(MyCellArrayContainingMyCellArrayContainingMyScalar);

Error using cell2mat (line 53)
Cannot support cell arrays containing cell arrays or objects.

但是让我们尝试另一种由不同数组组成的元胞数组:

 MyCellArray{1} = [ 1 2 3 ];
 MyCellArray{2} = 'This is the 2nd cell of MyCellArray!';

class(MyCellArray)
ans =
    cell

此元胞数组也不能使用以下方法转换为数组cell2mat

cell2mat(MyCellArray)

Error using cell2mat (line 46)
All contents of the input cell array must be of the same data type.

希望这有助于得到一个想法。

于 2012-12-29T12:48:24.747 回答