マッピングされたファイルへの書き込み
この例では、異なるメモリ マップを 3 つ作成してから、適切な構文を使用して各マップに書き込む方法を説明します。次に、マッピングされたデータのコピーを操作する方法を説明します。
MATLAB® ワークスペースの変数にアクセスするための MATLAB コマンドを使用して、ファイルに書き込むことができます。メモリ マップの Data
プロパティにアクセスすることによって、マッピングされたファイルの内容は現在アクティブなワークスペースにある配列として表示されます。ファイルにデータを書き込むには、この配列のインデックスを指定します。マッピングされたメモリへの書き込みに使用する構文は、メモリ マップの Data
プロパティの形式によって異なります。
数値配列としてマッピングしたメモリへの書き込み
最初に、現在のフォルダーに records.dat
という名前のサンプル ファイルを作成します。
rng('default') myData = rand([5000,1]); fileID = fopen('records.dat','w'); fwrite(fileID, myData,'double'); fclose(fileID);
16 ビット符号なし整数のシーケンスとしてファイルをマップします。名前と値のペアの引数 Format
を使用して、値を uint16
型に指定します。
m = memmapfile('records.dat', ... 'Offset',20, ... 'Format','uint16', ... 'Repeat',15);
ファイルは、単一のクラス (uint16
) のシーケンスとしてマッピングされるため、Data
は数値配列です。
マップされたファイルへの書き込み権限があることを確認します。メモリ マップ m
の Writable
プロパティを true
に設定します。
m.Writable = true;
Data
プロパティと同じサイズの行列 X
を作成し、ファイルのマッピングされた部分に書き込みます。メモリ マップを使用してデータに値を代入するときは、MATLAB の通常のインデックス付けとクラスのルールがすべて適用されます。代入先のクラスは、代入される値を保持するのに十分な大きさがなければなりません。
X = uint16(1:1:15); m.Data = X;
X
は、1 ~ 15 の範囲にある整数値の 1 行 15 列のベクトルです。
新しい値がファイルに書き込まれたことを確認します。ファイルの先頭から読み取りを開始するために、Offset
値に 0 を指定します。Repeat
の値を 35 に指定して、合計 35 の値を表示します。関数 reshape
を使用して、7 行 5 列の行列として値を表示します。
m.Offset = 0; m.Repeat = 35; reshape(m.Data,5,7)'
ans = 7x5 uint16 matrix 47739 26762 4663 16362 3197 24407 64575 16364 31612 40832 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 12673 53994 16337 46560 44024 32781 16353 24667 24572 41957
X 内の値が、records.dat
ファイルに書き込まれました。
スカラー構造体としてマッピングしたメモリへの書き込み
records.dat
ファイルの領域を、フィールド名 x
によって参照できる uint16
型の 300 行 8 列の行列でマッピングした後、フィールド名 y によって参照できる double
型の 200 行 5 列の行列でマッピングします。名前と値のペアの引数 Writable
を使用して、マッピングされたファイルへの書き込み権限を指定します。
m = memmapfile('records.dat', ... 'Format', { ... 'uint16' [300 8] 'x'; ... 'double' [200 5] 'y' }, ... 'Repeat', 1, 'Writable', true);
Data
プロパティを表示します。
m.Data
ans = struct with fields: x: [300x8 uint16] y: [200x5 double]
Data
は、スカラー構造体配列です。これは、records.dat
ファイルが繰り返しのない複数のデータ型を含むものとしてマッピングされるためです。
フィールド x
の行列を、すべて 1 の行列で置き換えます。
m.Data.x = ones(300,8,'uint16');
非スカラー構造体としてマッピングしたメモリへの書き込み
records.dat
ファイルを uint16
型の 25 行 8 列の行列としてマッピングした後、double
型の 15 行 5 列の行列としてマッピングします。このパターンを 20 回繰り返します。
m = memmapfile('records.dat', ... 'Format', { ... 'uint16' [5 4] 'x'; ... 'double' [15 5] 'y' }, ... 'Repeat', 20, 'Writable', true);
Data
プロパティを表示します。
m.Data
ans=20×1 struct array with fields: x y
ファイルが複数のデータ型の繰り返しシーケンスとしてマッピングされているので、Data
は非スカラー構造体配列です。
Data
の 12 番目の要素の x
という名前のフィールドに、すべて 1 の配列を書き込みます。
m.Data(12).x = ones(5,4,'uint16');
Data
の 12 番目の要素について、フィールド x
の 3 行目から 5 行目までのすべての要素に値 50 を書き込みます。
m.Data(12).x(3:5,1:end) = 50;
Data
の 12 番目の要素のフィールド x
を表示します。
m.Data(12).x
ans = 5x4 uint16 matrix 1 1 1 1 1 1 1 1 50 50 50 50 50 50 50 50 50 50 50 50
マッピングされたファイルへの書き込みの構文
マッピングされたメモリへの書き込みに使用する構文は、メモリ マップの Data
プロパティの形式によって異なります。メモリ マップのプロパティを表示するには、memmapfile
オブジェクトの名前を入力します。
次の表では、行列 X
をメモリ マップ m
に書き込むときの構文を説明します。
Data プロパティの形式 | マッピングされたファイルへの書き込みの構文 |
---|---|
数値配列 例: | m.Data = X; |
スカラー (1 行 1 列) 構造体配列 例: 1x1 struct array with fields: x y | m.Data.fieldname = X;
|
非スカラー ( 例: 20x1 struct array with fields: x y | m.Data(k).fieldname = X;
|
X
のクラスと X
の要素数は、Data
プロパティのそれらの値またはアクセス対象の Data
プロパティのフィールドと一致しなければなりません。関数 memmapfile
を使用してメモリ マップを作成した後、Data
プロパティの次元を変更することはできません。たとえば、マッピングされた配列 m.Data
に対して行の削除や追加を行って、配列のサイズを大きくしたり小さくしたりすることはできません。
ファイル全体をマッピングして、マップの作成後にそのファイルへデータを追加する場合、追加したデータはマッピング領域には含まれません。メモリ マップ m
にマッピングされているデータの次元を変更する必要がある場合は、m
の Format
プロパティまたは Repeat
プロパティを変更するか、関数 memmapfile
を使用して m
を作成し直さなければなりません。
メモ
マッピングされたファイルを正常に変更するには、そのファイルの書き込み権限が必要です。書き込み権限がない場合、Writable
プロパティが true
であってもファイルに書き込もうとするととエラーが発生します。
マッピングされたデータのコピーの操作
この例の部分では、マッピングされたデータのコピーを操作する方法を説明します。変数 d
のデータは、m.Data(2)
によってマッピングされたファイル データのコピーです。コピーであるため、d
内の配列データを変更しても、ファイルに含まれるデータは変更されません。
サンプル ファイル double.dat
を作成します。
myData = rand([5000,1])*100; fileID = fopen('double.dat','w'); fwrite(fileID,myData,'double'); fclose(fileID);
一連の double
の行列として、ファイルをマッピングします。
m = memmapfile('double.dat', ... 'Format', { ... 'double' [5 5] 'x'; ... 'double' [4 5] 'y' });
m.Data(2).x
の値を表示します。
m.Data(2).x
ans = 5×5 95.0545 54.7696 15.6697 97.2605 85.0706 53.2131 60.9054 5.8124 60.5319 25.6792 24.7686 86.3135 33.9707 33.8236 28.5496 43.7276 38.0696 81.7176 92.7984 77.9947 66.9088 74.8956 37.7548 89.8425 70.1395
m.Data
の内容を変数 d
にコピーします。
d = m.Data;
コピーの x
という名前のフィールドにすべて 0 を書き込みます。
d(2).x(1:5,1:5) = 0;
d(2).x
に 0 が書き込まれたことを確認します。
d(2).x
ans = 5×5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
マッピングされたファイルのデータが変更されていないことを確認します。
m.Data(2).x
ans = 5×5 95.0545 54.7696 15.6697 97.2605 85.0706 53.2131 60.9054 5.8124 60.5319 25.6792 24.7686 86.3135 33.9707 33.8236 28.5496 43.7276 38.0696 81.7176 92.7984 77.9947 66.9088 74.8956 37.7548 89.8425 70.1395