我有两个对我来说看起来完全相同的变量,但一个是<double>
,另一个是<cell>
。在代码中,它们似乎是由cell2mat
. 我知道这是一个数据存储的问题,但我只是看不到 and 的区别和cell
定义double
。
2 回答
添加到 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 字节。
数组和元胞数组可能是 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 元胞数组。还有可用mat2cell
的num2cell
命令。
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.
希望这有助于得到一个想法。