MAT ファイルへの変数の一部の読み込みと保存
関数 matfile
を使用して、変数の一部をメモリに読み込まずに MAT ファイルに直接読み込んで保存することができます。関数 load
または save
ではなく関数 matfile
を使用する主な利点は、メモリに入らないほど大きいデータセットの一部のみを処理できるという点です。このように大きな変数を操作する場合は、一度にメモリに読み取る/書き込むデータ量をできるだけ多くします。そうでない場合はファイルへのアクセスが繰り返され、コードのパフォーマンスに悪影響を与える可能性があります。
関数 matfile
を使用した読み込みと保存
この例では、関数 matfile
を使用した、既存の MAT ファイルへの変数の一部の読み込み、変更、保存の方法について説明します。
2 つの変数 A
と B
を使用して、Version 7.3 の MAT ファイルを作成します。
A = rand(5); B = magic(10); save example.mat A B -v7.3; clear A B
MAT ファイル example.mat
から MatFile
オブジェクトを作成します。関数 matfile
により、MAT ファイルに対応する MatFile
オブジェクトが作成され、MatFile
オブジェクトのプロパティが格納されます。既定の設定では、matfile
は既存の MAT ファイルからの読み込みのみが可能です。
exampleObject = matfile('example.mat');
保存を有効にするには、Writable
パラメーターを指定して matfile
を呼び出します。
exampleObject = matfile('example.mat','Writable',true);
または、オブジェクトの作成と Properties.Writable
の設定を別々の手順で行います。
exampleObject = matfile('example.mat');
exampleObject.Properties.Writable = true;
example.mat
から B
の最初の行を変数 firstRowB
に読み込んでデータを変更します。Version 7.3 の MAT ファイルに関連付けられたオブジェクトでインデックス操作を行う場合、MATLAB® は指定された変数部分のみを読み込みます。
firstRowB = exampleObject.B(1,:); firstRowB = 2 * firstRowB;
firstRowB
に格納されている値を使用して、example.mat
の変数 B
の最初の行の値を更新します。
exampleObject.B(1,:) = firstRowB;
非常に大きいファイルの場合、一度に読み取る/書き込むデータ量をできるだけ多くすることが、ベスト プラクティスです。そうでない場合はファイルへのアクセスが繰り返され、コードのパフォーマンスに悪影響を与えます。たとえば、ファイルに行と列が多く含まれているため、1 行を読み込むだけで、使えるメモリのほとんどの領域が必要になるとします。この場合、一度に 1 つの要素を更新する代わりに、各行を更新します。
[nrowsB,ncolsB] = size(exampleObject,'B'); for row = 1:nrowsB exampleObject.B(row,:) = row * exampleObject.B(row,:); end
メモリの問題がない場合は、変数の内容全体を一度に更新できます。
exampleObject.B = 10 * exampleObject.B;
また、-append
オプションを使用して関数 save
を呼び出し、変数を更新することもできます。-append
オプションは関数 save
に、指定した変数 B
のみを置き換え、ファイル内の他の変数はそのままにしておくように指示します。この方法では必ず変数全体を読み込んで保存する必要があります。
load('example.mat','B'); B(1,:) = 2 * B(1,:); save('example.mat','-append','B');
matlab.io.MatFile
オブジェクトを使用してファイルに変数を追加します。
exampleObject.C = magic(8);
-append
オプションを使用して関数 save
を呼び出し、変数を追加することもできます。
C = magic(8); save('example.mat','-append','C'); clear C
変数の一部の動的な読み込み
この例では、MAT ファイルから変数の一部に動的にアクセスする方法を説明します。この手法は、一部の変数名がわかっていない MAT ファイルを処理する場合に役立ちます。
サンプル ファイル topography.mat
に対応する MatFile
オブジェクトを作成します。関数 who
を使用して、ファイルに含まれている変数名を cell 配列 varlist
に格納します。
exampleObject = matfile("topography.mat");
varlist = who(exampleObject)
varlist = 3x1 cell
{'topo' }
{'topomap1'}
{'topomap2'}
2 番目と 3 番目の変数 topomap1
と topomap2
は、どちらもカラーマップ データを含む 3 列の行列です。これらの 2 つの変数のそれぞれの 3 番目の列からカラーマップ データを構造体 S
のフィールドに読み込みます。各フィールドに、元の変数名の前に "colormap_"
を付けたフィールド名を指定します。その後、各変数のデータには、exampleObject
のプロパティとしてアクセスします。varName
は変数のため、小かっこで囲みます。
for index = 2:3 varName = varlist{index}; S.("colormap_"+varName) = exampleObject.(varName)(:,3); end
構造体の内容を表示します。この構造体には 2 つのフィールド colormap_topomap1
と colormap_topomap2
があり、各フィールドに列ベクトルが含まれています。
S
S = struct with fields:
colormap_topomap1: [64x1 double]
colormap_topomap2: [128x1 double]
誤操作による全変数の読み込みの回避
MAT ファイルに含まれる大きい変数のサイズが不明であり、その変数の一部のみを一度に読み込む場合は、end
キーワードの使用を避けてください。end
キーワードを使用すると、該当する変数の内容全体が一時的にメモリに読み込まれます。非常に大きい変数の場合、読み込みに時間がかかるか、Out
of
Memory
エラーが発生します。代わりに、MatFile
オブジェクトに対し size
メソッドを呼び出します。
たとえば、次のコードは B
の内容全体を一時的にメモリに読み込みます。
lastColB = exampleObject.B(:,end);
代わりに、次にコードを使用してパフォーマンスを向上させます。
[nrows,ncols] = size(exampleObject,'B');
lastColB = exampleObject.B(:,ncols);
同様に、exampleObject.B
などの matObj.varName
形式の構文を使用して変数を参照するたびに、MATLAB® では変数全体が一時的にメモリに読み込まれます。そのため、以下のような構文を使用して MatFile
オブジェクトに size
メソッドを呼び出してください。
[nrows,ncols] = size(exampleObject,'B');
以下のように exampleObject.B
の内容全体を関数 size
に渡さないでください。
[nrows,ncols] = size(exampleObject.B);
これらの構文はほとんど同じですが、機能には大きな違いがあります。
部分読み込みと保存では Version 7.3 の MAT ファイルが必要
Version 7 以前の MAT ファイルに関連付けられた MatFile
オブジェクトを使用して読み込みまたは保存を行うと、変数全体が一時的にメモリに読み込まれます。
関数 matfile
を使用して、Version 7.3 形式のファイルを作成します。たとえば、以下のコードについて考えます。
newfile = matfile('newfile.mat');
このコードでは部分的な読み込みと保存をサポートする MAT ファイルが作成されます。
ただし、既定の設定では、関数 save
は Version 7 の MAT ファイルを作成します。次のように -v7.3
オプションを使用して関数 save
を呼び出し、既存の MAT ファイルを Version 7.3 形式に変換します。
load('durer.mat'); save('mycopy_durer.mat','-v7.3');
新規ファイルを Version 7.3 形式で保存するように基本設定を変更するには、[ホーム] タブの [環境] セクションにアクセスし、 [基本設定] をクリックします。[MATLAB] 、 [一般] 、 [MAT ファイル] を選択します。この基本設定は、MATLAB® Online™ では利用できません。