1

私にはまったく同じように見える 2 つの変数がありますが、1 つは<double>で、もう 1 つは です<cell>。コードでは、 によって変換されているようですcell2matcellそれがデータストレージの問題であることは理解していますが、違いと定義がわかりません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 バイトを使用します)。
  • A2 行目は、生成するセルを 1 つだけラップすると、 B112 バイトが追加されることを示しています。これは、MATLAB の単一セルのオーバーヘッドです。
  • 3 行目は、 C5 つのセルが含まれており、(112+8)×5 = 600 バイトであることを確認しています。
于 2012-12-30T15:51:06.970 に答える
4

配列と 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 つの異なる配列すべてのクラスは です。使用される数値精度 (倍精度) を意味します。classdouble

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.

これがアイデアを得るのに役立つことを願っています。

于 2012-12-29T12:48:24.747 に答える