主要内容

。

MATLABででのメモリメモリの方法

配列へのメモリの割り当て

このトピックでは,配列および変数を扱うときに,MATLAB®がメモリをを方法についてについて明します。コードを记述するに,メモリのより效率使使をすることを目といいますます。,これらの内部内部定理について心配することはありん。

メモ:

MATLABによるデータの内部的な処理に関する情報は,将来のリリースで変更されることがあります。

配列の作物成と

数码配列文配列ををににするする合书,matlabでは,メモリの连続しバーチャルブロック割り当て,その,matlabでは,クラス。また,matlabでは,クラスや次元などの配列にややなどの配列データ关键词“ヘッダー”と呼ばれる別の小さなメモリブロックに保存されます。

�メモリ ブロックを見つけなければなりません。MATLAB によって、配列のコンテンツが元の位置から新しいメモリ ブロックにコピーされ、ブロックの配列に新しい要素が追加され、メモリの元の配列の位置が解放されます。

既存の配列から要素を削除すると,MATLABでは,削除した要素が除去されてメモリストレージが连続に保たれ,元のメモリの位置でストレージが圧缩されます。

大きなデータセットの扱い-大きなデータセットを扱う場合,メモリ不足が原因で起こるエラーを避けるために,配列のサイズを増やすときには注意が必要です。元の位置で使用可能な連続メモリを超えて配列を拡張する場合,MATLABでは,上に説明したように,メモリの新しい位置に配列のコピーが作成され,この配列に新しい値が設定されます。この処理の間は,メモリに元の配列のコピーが2つ存在するため,配列に必要なメモリ量が一時的に2倍になり,プログラムの実行中にメモリが不足する可能性が増加します。配列で考えられる最大サイズに対し,十分なメモリをあらかじめ割り当てておくことを推奨します。事前割り当てを参照してください。

配列のコピー

内部的には,複数の変数で同じデータブロックを指し,配列の値を共有することができます。変数を他の変数にコピーする(たとえば,B =一个)综合,matlabでは,配列ではなく,配列参照のコピーがない。配列配列コンテンツコンテンツしない限制,复ののを保存するはありん保存保存ありません。〖作文成〗,このコピーが変更され。

この例でで,关节记忆を使用してMATLABでの配列のコピーの処理方法を示します。记忆は窗户®システムでのみ使用できます。

MATLABプロセスで使使用しているメモリを表示するに,まず简なスクリプトmemused.m.を作成します。以下の2行のコードをスクリプトに記述します。

[usr, sys] =内存;usr。MemUsedMATLAB

MATLABプロセスで使用されているメモリ量の初期値を取得します。

格式化短工程;Memused ANS = 295.4977e + 006

2000行2000列の数値配列一个を作成します。これは,およそ32 MBのメモリを使用します。

一个=魔法(2000);MEMUSED ANS = 327.6349E + 006

B.に配列一种のコピーを作成します。配列データのコピーが2つある必要はないので,MATLABは配列参照のコピーのみを作成します。このため,メモリの使用量が大幅に増加することはありません。

B =一个;MEMUSED ANS = 327.6349E + 006

B.を変更して,元のサイズの半分にします。つまり1000行分を空にします。この作業を行うには,MATLABによって配列一种の少なくとも最初の1000行がコピーされ,このコピーがB.に代入されます。

: B (1001:2000) = [];格式短;(B) ans = 1000 2000

再び,使用されてメモリを确认します。B.は元のサイズに比べて大幅に小さくなっていますが,B.一种への参照のみではなくなったため,MATLABのプロセスで使用されるメモリ量は約16 MB(元々一种に必要だった32 MBの半分)増加しました。

格式化短工程;Memused ANS = 343.6421e + 006

配列ヘッダー

MATLAB,MATLAB,MATLABではではヘッダーと呼ばれる别のメモリ断片にに配列情情されれれほとんどささではほとんど情配列ではは情情配列ででは情情を配列でに规模なデータセット,多数の小さな配列ではなく,少の大厦配列に格式した场は,必要はながややなります。これこれ,前者で必要な配列配列少なく少なくはされため少なく。

構造体と细胞配列-构造体と细胞配列では,matlabでは各配列のみでなく,构造体の各,细胞配列の各セルに対してがががさされ。このこの,构造体または细胞配列格式するためため必要なメモリは,保存するデータ量だけでなく作用法にに依存ます。

たとえば,フィールドR.GB.をもつ,スカラー构造体配列S1を考えてみましょうサイズが100 x 50の各フィールドは,繁体繁体をするためのヘッダーがががつつつががつつつつががががががががががががつずつつずつつずつつずつつずつつずつつずつつずつつずつつずつつずつつずつつずつつずつつずつつずつつずつつずつつずつつずつつずつつずつがつずつがつずつつずつがつずつがががががが1のにより,データ构造全ですでヘッダー,データ构造全でれ。

S1.R(1:100,1:50)S1.G(1:100,1:50)S1.B(1:100,1:50)

一方,各各要素がスカラーR.GB.である100行50列の构造体配列S2をを考えてみましょましょう例では,繁体体系を记述する配列ヘッダー1つ,各フィールド名に対してヘッダー1つずつ,构造体の5,000要素ににヘッダー1つが必要で,データ构造全体で合约15,004の配列ヘッダーが制作。

S2(1:10 0, 1:50)。R.S2(1:10 0, 1:50)。GS2(1:10 0, 1:50)。B.

S1S2は同じ量のデータを含みますが,S1では使用するメモリがかなり少なくなります。S1ののを使使と,必要なメモリがててだけでなく,管理速度が速くなります。

データ构造とメモリの”细胞配列“と”構造体”を参照してください。

关关WHOSで表示されるメモリメモリ使使使使使关节谁是では,変数で消费さメモリ量が表示れます便。简而言之。谁是たとえば,配列ヘッダーのます含まれれれませんれません。

关节数量

MATLABでは,関数呼び出しで渡される引数が同様に扱われます。关节に 1 つの変数を渡すときには、実際は、変数が表すデータに対する参照も渡しています。呼び出された関数で入力データが変更されない限り、呼び出し側の関数内の変数と、呼び出された関数内の変数は、メモリ内の同じ位置を指しています。呼び出された関数で入力データの値が変更される場合は、MATLAB によってメモリ内の新しい位置に元の配列のコピーが作成され、このコピーが変更された値で更新され、呼び出された関数内の入力変数がこの新しい配列を指すようになります。

次のの例で,关节myfun.によってによって渡された配列配列値が変更さされ.matlabによって,一种がが指す配列ののコピーが作作作作作作作作作作者Xがこの新闻配列への参照に设定され,Xの1行がゼロに設定されます。一种により参照される配列,変更されません。

一个=魔法(500);myfun(一个);函数myfun(X) X(400,:) = 0;

呼び出し侧の关键词myfun.に渡した配列の変更された値が必要な場合は,ここで変数一种に対して示すように,呼び出された関数の出力として更新された配列を返さなければなりません。

一个=魔法(500);一个= myfun (A);函数Y = myfun(X) X(400,:) = 0;Y = X;

データ构造とメモリ

必要なメモリ量は,さまざまなMATLABのデータ構造によって異なります。马铃薯での格納方法を工夫すると、これらの構造で使用するメモリ量を減らせる場合があります。

数値配列

MATLABでは,8ビット,16ビット,32ビット,64ビットの符符およびおよびなしなしなしを格式するために,それぞれ,1,2,4,8バイトが必要です。动动小数数单身的型と型に対しては,それぞれ,4または8バイトを使用します。数値配列を取り扱う際にメモリを節約するために、MathWorks®では,オーバーフローせずにデータを格納できる最小の整数型または浮動小数点型を使用することをお勧めします。詳細は,数量型を参照してください。

複素数配列

MATLABは,インターリーブされた複素数のストレージ表現を使用します。つまり,実数部と虚数部が併せて,メモリの連続するバーチャルブロックに保存されます。複素配列のコピーを作成してから,配列の実数部または虚数部のみを変更すると,MATLABでは実数部と虚数部の両方を含む配列が作成されます。詳細については,matlabのmex关节におけるインターリーブさたた复素のサポートを参照してください。

スパース行列

大众分数が値値行は,スパース形式に格式することスパース行ますて非を行列比べ,スパース行列が比べてメモリ少なく少なく列列少なく。关联をを使て,非スパース行列を形式にできでき。

2つの1000行1000列の行列を比較します。Xは要素の3分の2がゼロである双の行列,yXをスパース行列に変換したコピーです。次の例は,スパース行列では必要なメモリがほぼ半分になることを示しています。

X 1000x1000 8000000双数组Y 1000x1000 4004000双数组(稀疏)

细胞配列

细胞配列では,データストレージに加え,各セルを説明する情報を格納する追加のメモリが必要です。この情報は“ヘッダー”にに记录されに対して配列のの各がありに対してデータのヘッダーヘッダーがありありデータを含まないないない行行ないないない行行ないない行行行1ので消费されるバイトを求めることによりによりことことによりによりことをことことことことをのことヘッダーことのののヘッダーヘッダー必要ををすることができます.64ビットシステムののますををに示します。

c = {[]};%空单元格阵列C名称大小字节类属性C 1x1 104单元格

电池配列全体のサイズサイズを予测するに,ヘッダーヘッダーサイズに配列内ののの総総を乘算してからからに纳纳するデータにな

(header_size x number_of_cells)+数据

たとえば,400バイトのを含む10行20列の细胞配列配列は,64ビットシステムで21,200バイトのメモリがです。

(104 x 200) + 400 = 21200

メモ

数値配列は連続したメモリに保存しなければなりませんが,構造体と细胞配列ではその必要はありません。

例 - 细胞配列へのメモリのの割り当 -次の4行1列の细胞配列には,3台のノートブックコンピューターの名,スクリーンサイズ,価格,贩売状况が记录され。

笔记本电脑= {['superrrfast 89x','可靠的g5',...'ucana4dit 140l6'];... [单(17),单(15.4),单(14.1)];... [2499.99,1199.99,499.99];... [真实,真,假]};

64年ビットシステムでは,细胞配列ヘッダーのみで细胞あたり104バイトが必要です。

每个单元格* 104字节=单元格阵列的416字节

4つのセルそれぞれにデータをために必要なをしします。

每个char = 95个字符* 2个字节= 90字节3单曲*每单个= 12个字节= 12个字节3双打*每双倍* 8个字节= 24个字节3逻辑*每逻辑= 3个字节90 + 12 + 24 + 3 = 129字节对于数据

2,〖matlab〗,〖matlab〗。

416 + 129 = 545 bytes total whos膝上型电脑名称大小字节类属性膝上型电脑4x1 545 cell

構造体

64年ビットシステムでは,構造体配列の各フィールドに104バイトのヘッダーが必要です。さらに,個々の一意のフィールド名に64バイトのヘッダーが必要です。たとえば,空のフィールドを 1 つもつ構造体は、168 バイト (フィールドに 104 バイトと、フィールド名に 64 バイト) を消費します。

S.A = [];WHOS名称大小字节类属性S 1x1 168 STRUCT

构造体配列配列体のををするには,ヘッダーの総バイト数を计算てから,配列に格式するにななをを。

Number_of_fields x ((number_of_array_elements x field_header_size) + fieldname_header_size) + data

たとえば,地址电话のフィールドをもつ4行5列の构造体客户4288年は,ヘッダーのみでバイトを使用します。

2 x ((20 x 104) + 64) = 4288字节

この値に対し,各フィールドに代入されるデータの保持に必要なメモリを追加しなければなりません。4行5列の配列客户の各要素において,地址に25字の文字ベクトル,电话に12字の文章ベクトルを代入と,データでは1,480バイトが必要。

(25 + 12)字符*每个char * 2个字节* 20元素= 1480字节

2つを加算すると,構造体全体では5768バイトのメモリを消費することがわかります。

例——構造体配列へのメモリの割り当て-64年ビットシステムで,以下のフィールド値をもつ6行5列の構造体配列を格納するために必要なメモリ量を計算します。

A: 5 × 8 × 6有符号8位整数数组B: 1 × 500单数组C: 30 × 30无符号16位整数数组D: 1 × 23字符数组

作作作作者:王莹:

a = int8(那些(5,8,6));B =单身(1:500);c = UINT16(魔术(30));D ='公司名称:MATHWORKS';s = struct('f1',a,'f2',b,'f3',c,'f4',d);对于n = 1:5的m = 1:5(m,n)= s(1,1);结束

まず构造体自体に必要な构造体をしデータ必要构造体がデータになメモリ体を计算し。

数据= (field1 + field2 + fiel3 + fiel4) x array elements = (240 + 2000 + 1800 + 46) x 30 = 122580 bytes

2,〖matlab〗,〖matlab〗。

结构S: 12736 + 122,580 = 135,316 whoos S Name Size bytes Class Attributes S 6x5 135316 struct