私にはまったく同じように見える 2 つの変数がありますが、1 つは<double>
で、もう 1 つは です<cell>
。コードでは、 によって変換されているようですcell2mat
。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
2 行目は、生成するセルを 1 つだけラップすると、B
112 バイトが追加されることを示しています。これは、MATLAB の単一セルのオーバーヘッドです。- 3 行目は、
C
5 つのセルが含まれており、(112+8)×5 = 600 バイトであることを確認しています。
配列と cell 配列は、おそらく MATLAB で最も一般的に使用される 2 つのデータ型です。
1D および 2D 配列は、線形代数の数学と同じように行列です。ただし、配列は多次元 (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
したがって、コマンドdouble
によって報告されるように、これら 5 つの異なる配列すべてのクラスは です。使用される数値精度 (倍精度) を意味します。class
double
cell 配列は、より抽象的な概念です。cell 配列は 1 つ以上の配列を保持でき、配列以外の他の型の変数も保持できます。セル配列は、セル配列が保持できるものは何でも保持できる他のセル配列を保持することもできます。そのため、セル配列は相互に再帰的に格納することもできます。
セル配列は、さまざまなオブジェクトを 1 つの変数に結合するのに役立ちます。関数に渡すか、 で処理しcellfun
ます。各セル配列は、1 つ以上のセルで構成されます。任意の配列は、演算子を使用してセル配列に変換できます{
}
。結果は 1 行 1 列のセル配列になります。mat2cell
およびnum2cell
コマンドも使用できます。
MyCellArrayContainingMyScalar = { MyScalar };
MyCellArrayContainingMyHorizVector = { MyHorizVector };
MyCellArrayContainingMyCellArrayContainingMyScalar = { MyCellArrayContainingMyScalar };
上で作成したすべての cell 配列は 1 行 1 列の cell 配列です。
class(MyCellArrayContainingMyScalar)
ans =
cell
class(MyCellArrayContainingMyHorizVector)
ans =
cell
class(MyCellArrayContainingMyCellArrayContainingMyScalar)
ans =
cell
ただし、すべての cell 配列を を使用して行列に変換cell2mat
できるわけではありません。これは、1 つの cell 配列が、同じ配列内に存在できない複数の異なるデータ型を保持できるためです。
これらは機能します:
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
この cell 配列は、 を使用して配列に変換することもできませんcell2mat
:
cell2mat(MyCellArray)
Error using cell2mat (line 46)
All contents of the input cell array must be of the same data type.
これがアイデアを得るのに役立つことを願っています。