Matlabのセル(つまりwith { }
)とマトリックス(つまりwith )の違いは何ですか?[ ]
1 に答える
MATLAB の cell 配列と行列にはいくつかの違いがあります。
セル配列には、各セルに任意の型の要素を含めることができます。一方、行列では、その要素の型が同種、つまり同じ型である必要があります。
メモリ レイアウトに関する限り、行列のすべての要素はメモリ内で連続して配置されますが、セル配列には配列の各要素へのポインターが含まれます。これは、高性能コードのキャッシュの局所性などを考慮する場合に重要です。
ポイント 2 の裏返しとして、行列のサイズを変更する場合、行列のすべての要素を新しく割り当てられたメモリ領域にコピーする必要がありますが、セル配列の場合はポインタのリストのみをコピーする必要があります。格納する要素のサイズと型によっては、セル配列の方がサイズ変更がはるかに高速であることを意味する場合があります。
メモリ レイアウトの違いを説明するために、簡単な例を考えてみましょう。
A = [10 20 30 40];
ここで、MATLAB は A という名前の新しい行列変数を作成し、4 つの double を保持するのに十分なメモリ (32 バイト、8 バイトの double を想定) を割り当て、このメモリを A の実部を指すポインターに割り当てます。数、虚数部にもメモリが割り当てられ、別のポインタがこのメモリ領域を指します)。
次に、これらの要素を保持するセル配列を作成しましょう。
B = cell(1, 4);
B{1,1} = 10;
B{1,2} = 20;
B{1,3} = 30;
B{1,4} = 40;
MATLAB が最初のステートメントを実行すると、4 つのポインターを含む cell 配列が作成されます。各ポインターは任意の型を指すことができます。そのB
ため、すでに 16 バイトを使用しています (32 ビット ポインターを想定)。次の行は、値 10 を含む 1 行 1 列の行列を作成し、それを最初の cell 配列要素に割り当てます。ここでのプロセスは、上記で説明した 1x4 行列の作成と似ていますが、割り当てられたメモリが 1 つの double (8 バイト) を保持するのに十分な大きさだけである点が異なります。これは、残りの 3 つのステートメントごとに繰り返されます。したがって、最低限、2 番目の例では16 + 8 x 4 = 48
バイトを使用しています。
MATLAB の各変数には、その変数に関する次元、データ型などの情報を格納するmxArrayと呼ばれる構造体のメモリ オーバーヘッドも含まれることに注意してください。簡単にするために、このオーバーヘッドは無視しました。