Main Content

MAT ファイルへの変数の一部の読み込みと保存

関数 matfile を使用して、変数の一部をメモリに読み込まずに MAT ファイルに直接読み込んで保存することができます。関数 load または save ではなく関数 matfile を使用する主な利点は、メモリに入らないほど大きいデータセットの一部のみを処理できるという点です。このように大きな変数を操作する場合は、一度にメモリに読み取る/書き込むデータ量をできるだけ多くします。そうでない場合はファイルへのアクセスが繰り返され、コードのパフォーマンスに悪影響を与える可能性があります。

関数 matfile を使用した読み込みと保存

この例では、関数 matfile を使用した、既存の MAT ファイルへの変数の一部の読み込み、変更、保存の方法について説明します。

2 つの変数 AB を使用して、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 番目の変数 topomap1topomap2 は、どちらもカラーマップ データを含む 3 列の行列です。これらの 2 つの変数のそれぞれの 3 番目の列からカラーマップ データを構造体 S のフィールドに読み込みます。各フィールドに、元の変数名の前に "colormap_" を付けたフィールド名を指定します。その後、各変数のデータには、exampleObject のプロパティとしてアクセスします。varName は変数のため、小かっこで囲みます。

for index = 2:3
    varName = varlist{index};
    S.("colormap_"+varName) = exampleObject.(varName)(:,3);
end

構造体の内容を表示します。この構造体には 2 つのフィールド colormap_topomap1colormap_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™ では利用できません。

参考

| |

関連するトピック