是什么存储在单元格中的数据,并存储为双MATLAB中的数据之间的差异?(What is the di

2019-10-17 13:23发布

我有两个变量,谁长得一模一样给我,但一个是<double> ,另一个是<cell> 。 在代码中他们似乎被转换cell2mat 。 我的理解是数据存储的问题,但我只是不明白的区别和定义celldouble本。

Answer 1:

添加到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                
  • 正如可以从第一行看到,基本1×5矢量A双打的取入存储器40个字节(每个双需要8个字节)。
  • 第二行示出了只是包裹A与单个细胞以产生B增加了额外的112个字节。 这是在MATLAB单个细胞的开销。
  • 第三行确认,因为C包含5个细胞,并采取(112 + 8)×5 = 600个字节。


Answer 2:

数组和电池阵列可能是在MATLAB中最常用的两种数据类型。

一维和二维阵列是矩阵就像在数学,线性代数。 但阵列也可以是多维的(n维)阵列,也被称为张量,MATLAB称他们为多维数组。 此外,MATLAB不会使标量和阵列之间,也没有载体和其它基质之间的任何区别。 的标量是刚在MATLAB一个1x1阵列,并且载体是NX1和在MATLAB的1×N阵列。

一些例子:

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.

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



文章来源: What is the difference between the data stored in a cell and the data stored as double in MATLAB?