Matlab saveコマンドの使い方を徹底解説


Matlab saveコマンドの使い方を徹底解説:データの保存と管理をマスターする

はじめに:なぜMatlabのデータを保存する必要があるのか?

Matlabを使ったデータ分析やシミュレーションにおいて、計算結果や生成したデータは非常に重要です。これらのデータを作業セッション間で保持し、再利用可能にするためには、適切にファイルに保存する必要があります。Matlabにはデータをファイルに保存するための主要なコマンドとしてsaveが用意されています。

saveコマンドは非常に多機能であり、単にワークスペースの変数をファイルに書き出すだけでなく、特定の変数だけを保存したり、様々なファイル形式を選択したり、既存のファイルにデータを追加したりといった多様な操作が可能です。しかし、その豊富なオプションゆえに、どのように使い分ければ良いのか迷うこともあるでしょう。

この記事では、Matlabのsaveコマンドについて、基本的な使い方から、様々なオプションの詳細、保存形式の種類と選択基準、さらには大規模データの取り扱いや注意点、ベストプラクティスに至るまで、徹底的に解説します。この記事を読めば、あなたはsaveコマンドを自信を持って使いこなし、Matlabでのデータ管理をより効率的かつ安全に行えるようになるでしょう。

さあ、Matlabのデータ保存の鍵となるsaveコマンドの世界へ踏み込みましょう。

1. saveコマンドの基本:最も単純な使い方から

saveコマンドの最も基本的な役割は、現在のMatlabワークスペースにある変数や関数などをファイルに書き出すことです。これにより、Matlabを終了しても、次にMatlabを起動した際に保存したファイルを読み込むことで、前回の作業状態の一部(ワークスペースの変数など)を再現できます。

1.1. 最も単純な使い方:save

最も単純なsaveコマンドの使い方は、引数を何も指定しない場合です。

“`matlab
% 現在のワークスペースにいくつかの変数を作成
a = 10;
b = magic(3);
c = ‘Hello, world!’;

% 引数なしでsaveを実行
save;
“`

このコマンドを実行すると、Matlabはデフォルトで現在のワークスペースにあるすべての変数を、現在の作業ディレクトリにmatlab.matという名前のファイルとして保存します。

  • デフォルトのファイル名: matlab.mat
  • デフォルトの保存内容: 現在のワークスペースのすべての変数
  • デフォルトの保存場所: 現在のMatlabの作業ディレクトリ (pwdコマンドで確認できます)
  • デフォルトのファイル形式: Matlab独自のバイナリ形式であるMATファイル (バージョンによって異なりますが、現在(R2020b以降のデフォルト)は通常v7.3形式、古いバージョンではv7形式が多い)

保存されたファイルは、同じディレクトリにある限り、loadコマンド(例: load; または load matlab.mat;)を使って後でMatlabワークスペースに読み込むことができます。

1.2. ファイル名を指定して保存:save filename

デフォルトのファイル名matlab.matは、複数のプロジェクトや異なる時点のデータを保存する場合に不便です。通常は、保存する内容がわかるような意味のあるファイル名を指定して保存します。

“`matlab
% 現在のワークスペースにいくつかの変数を作成
data_analysis_results = randn(100, 10);
simulation_parameters = struct(‘iter’, 1000, ‘tol’, 1e-6);

% ファイル名を指定して保存
save(‘analysis_data.mat’);
“`

または、ファイル名を文字列リテラルとして直接指定することもできます。

matlab
save analysis_data.mat; % こちらの方がよく使われるかもしれません

このコマンドを実行すると、現在のワークスペースにあるすべての変数が、指定した名前(ここではanalysis_data.mat)のファイルとして、現在の作業ディレクトリにMAT形式で保存されます。

  • 指定したファイル名: analysis_data.mat (.mat拡張子は自動的に付与されることが多いですが、明示的に付けておくのが一般的です)
  • デフォルトの保存内容: 現在のワークスペースのすべての変数
  • デフォルトの保存場所: 現在のMatlabの作業ディレクトリ
  • デフォルトのファイル形式: MATファイル (v7.3またはv7など)

ファイル名を指定することで、保存するデータの内容や、いつ保存されたものかを明確に区別できるようになります。

1.3. 特定の変数を指定して保存:save filename var1 var2 ...

多くの場合、ワークスペースには分析の途中で生成された一時的な変数や、保存する必要のない大きな変数などが存在します。これらの不要な変数まで含めてすべてを保存すると、ファイルサイズが不必要に大きくなったり、読み込みに時間がかかったりする可能性があります。特定の、本当に保存したい変数だけを選んで保存したい場合は、ファイル名の後に変数名を列挙します。

“`matlab
% ワークスペースに複数の変数がある
result = rand(5, 5);
temp_data = zeros(1000, 1000); % 保存したくない一時変数
parameters = [1, 2, 3];
summary_stats = struct(‘mean’, mean(result(:)), ‘std’, std(result(:)));

% result、parameters、summary_stats の3つの変数だけを保存
save(‘subset_data.mat’, ‘result’, ‘parameters’, ‘summary_stats’);
“`

このコマンドを実行すると、指定したファイル名(subset_data.mat)に、列挙された変数(result, parameters, summary_statsだけがMAT形式で保存されます。temp_dataのような他の変数は保存されません。

  • 指定したファイル名: subset_data.mat
  • 指定した変数: result, parameters, summary_stats
  • デフォルトの保存場所: 現在のMatlabの作業ディレクトリ
  • デフォルトのファイル形式: MATファイル (v7.3またはv7など)

保存する変数を明示的に指定することは、ファイルサイズを管理し、後でファイルを読み込んだ際にワークスペースが不要な変数で溢れかえるのを防ぐ上で非常に有効です。

変数名を指定する際は、変数名を文字列として(シングルクォーテーションで囲んで)指定することに注意してください。

1.4. ワイルドカードを使った変数指定:save filename pattern

複数の変数名が特定のパターンに従っている場合、個々の変数名をすべて列挙するのは面倒です。このような場合は、アスタリスク (*) や疑問符 (?) のワイルドカード文字を使って、パターンに一致するすべての変数を指定できます。

  • *: 任意の数の文字に一致します。
  • ?: 任意の1つの文字に一致します。

例:
“`matlab
% ワークスペースに複数の変数がある
data_exp1 = rand(10);
data_exp2 = rand(10);
data_exp3 = rand(10);
param_A = 1;
param_B = 2;
misc_var = ‘ignore’;

% ‘data_exp’ で始まるすべての変数を保存
save(‘experiment_data.mat’, ‘data_exp*’);

% または、’param_’ の後に任意の1文字が続く変数を保存
save(‘parameters.mat’, ‘param_?’);
“`

最初のsaveコマンドでは、data_exp1, data_exp2, data_exp3の3つの変数がexperiment_data.matに保存されます。二番目のsaveコマンドでは、param_A, param_Bの2つの変数がparameters.matに保存されます。

ワイルドカードは、命名規則を統一している変数群を一括で保存したい場合に非常に便利です。

1.5. 既存ファイルへの追加または上書き:-appendオプション

デフォルトでは、saveコマンドで指定したファイルが既に存在する場合、そのファイルは上書きされます。つまり、既存のファイルの内容は完全に消去され、新しく指定した変数だけが保存されます。

しかし、既存のファイルに変数を追加したい、あるいは既存のファイル内の特定の変数だけを上書きしたいという場合があります。このような場合は、-appendオプションを使用します。

“`matlab
% まず最初のデータを保存
var1 = 100;
var2 = ‘Initial data’;
save(‘my_data.mat’, ‘var1’, ‘var2’);

% 後で別の変数を追加する
var3 = [1, 2, 3];
save(‘my_data.mat’, ‘var3’, ‘-append’); % my_data.matにvar3を追加

% さらに後で var2 の内容を変更し、上書きしたい
var2 = ‘Updated data string’;
save(‘my_data.mat’, ‘var2’, ‘-append’); % my_data.mat内の var2 を更新
“`

-appendオプションを使ってsaveを実行すると、以下の動作になります。

  1. 指定したファイルが存在しない場合:通常のsaveと同様に、新しいファイルを作成して指定した変数を保存します。
  2. 指定したファイルが存在する場合:
    • 指定した変数名がファイル内に存在しない場合:その変数がファイルに追加されます。
    • 指定した変数名がファイル内に存在する場合:ファイル内のその変数の内容が、現在のワークスペースの変数の内容で上書きされます。

-appendオプションは、同じMATファイルに段階的にデータを保存していく場合に役立ちます。ただし、注意点として、古いMATファイル形式(v6など)に対して-appendを使用すると、互換性の問題やパフォーマンスの問題が発生する可能性があります。新しい形式(v7.3など)での使用が推奨されます。また、-appendMAT形式のファイルにのみ有効です。テキスト形式(-ascii)のファイルには使用できません。

1.6. 保存されるデータの形式:MATファイルとは?

前述の通り、saveコマンドで特に形式を指定しない場合(または-matオプションを指定した場合)は、Matlab独自のバイナリ形式であるMATファイルとしてデータが保存されます。

MATファイルは、Matlabで扱える様々なデータ型(数値配列、論理配列、文字配列、構造体、セル配列、テーブル、時系列データ、オブジェクトなど)を、その型情報や構造を保ったまま効率的に保存するために設計されています。テキストファイルのように人間が直接読むことはできませんが、Matlabが高速に読み書きできます。

MATファイル形式にはいくつかのバージョンがあり、Matlabのバージョンによってデフォルトやサポートされる機能が異なります。主なバージョンにはv6、v7、v7.3があります。これらのバージョン間の違いは、ファイルサイズ、読み書き速度、サポートされるデータの最大サイズ、および互換性に影響します。この点については、後述の「保存形式の指定」セクションで詳しく説明します。

2. 保存形式の指定:MAT形式とテキスト形式

saveコマンドの強力な機能の一つに、保存するファイルの形式を選択できる点があります。主にMAT形式とテキスト形式(ASCII)が利用可能です。

2.1. MAT形式のバージョンを指定する:-vNオプション

MatlabはMATファイル形式のいくつかのバージョンをサポートしており、互換性や機能に応じて使い分けることができます。-vNオプションを使ってバージョンを指定します。

  • -v7.3: Matlab R2006b以降で利用可能。HDF5という汎用的なデータフォーマットに基づいています。
  • -v7: Matlab 7.0以降のデフォルト形式(R2020bより前)。
  • -v6: Matlab R14 (バージョン 7.0) より前の古い形式。最も広い互換性がありますが、いくつかの制限があります。

各形式の特徴、メリット、デメリットを見てみましょう。

-v7.3 形式
  • 特徴: HDF5 (Hierarchical Data Format) と呼ばれる、科学技術データ向けに設計された汎用的なファイルフォーマットに基づいています。
  • メリット:
    • 巨大なデータのサポート: 2GBを超えるサイズの変数やファイルも保存できます。これはv7形式以前の大きな制限でした。
    • 部分読み込み/書き込み: matfile関数を使用することで、ファイル全体をメモリに読み込むことなく、ファイル内の特定の変数や、変数の一部(配列のスライスなど)のみを読み書きできます。これは大規模データ処理においてメモリ効率を大幅に向上させます。
    • 外部ツールからのアクセス: HDF5形式に基づいているため、Matlab以外のHDF5をサポートする様々なツールやプログラミング言語(Pythonのh5pyライブラリなど)から直接ファイルの内容にアクセスしやすい場合があります。
    • メタデータの保存: ファイルやデータセットに関連するメタデータを保存できます。
  • デメリット:
    • 互換性: 古いMatlabバージョン(R2006a以前)では読み込めません。
    • ファイルサイズ: v7形式よりもファイルサイズが大きくなる傾向がある場合があります。
    • パフォーマンス: 小さなデータの場合、v7形式よりも保存・読み込みに時間がかかる場合があります。
  • 使用例:
    matlab
    large_data = rand(10000, 10000); % 巨大なデータ
    save('large_dataset.mat', 'large_data', '-v7.3');
-v7 形式
  • 特徴: Matlab 7.0 (R14) から R2020a までのデフォルト形式です。v6形式よりも効率的にデータを保存でき、より多くのデータ型をサポートします。
  • メリット:
    • 互換性: Matlab 7.0以降の比較的広い範囲のバージョンで読み込めます。
    • ファイルサイズ/速度: 多くの場合、v7.3よりもファイルサイズが小さく、読み書き速度が速い場合があります(特にデータサイズが2GB未満の場合)。
  • デメリット:
    • データサイズ制限: 1つの変数やファイルサイズが2GBを超える場合は保存できません。
    • 部分読み込み不可: ファイル全体または特定の変数全体を一度に読み込む必要があり、部分的な読み込みはサポートされません(ただし、loadコマンドで特定の変数名を指定することは可能です)。
  • 使用例:
    matlab
    standard_data = magic(1000); % 2GB未満のデータ
    save('standard_data.mat', 'standard_data', '-v7'); % または save('standard_data.mat', 'standard_data'); (古いMatlabバージョンのデフォルト)
-v6 形式
  • 特徴: Matlab R14 (バージョン 7.0) より前の最も古いMATファイル形式です。
  • メリット:
    • 最も広い互換性: 非常に古いMatlabバージョンでも読み込むことができます。
  • デメリット:
    • データサイズ制限: 1つの変数やファイルサイズが2GBを超える場合は保存できません。
    • サポートされないデータ型: セル配列、構造体、オブジェクトなど、新しいMatlabバージョンで導入されたデータ型の一部は正しく保存できないか、互換性のない形式で保存されます。
    • 効率: ファイルサイズが大きくなりがちで、読み書きも比較的遅いです。
  • 使用例:
    matlab
    % 非常に古いMatlabバージョンとの互換性が必要な場合
    legacy_data = [1 2 3; 4 5 6];
    save('legacy_data.mat', 'legacy_data', '-v6');
どのバージョンを選ぶべきか?
  • 特別な理由がない限り: Matlab R2020b以降を使用している場合は、デフォルトである-v7.3形式が推奨されます。大規模データ対応や部分読み込みなどのメリットが大きいためです。
  • 古いMatlabバージョンとの互換性が必要な場合: データを読み込む側のMatlabのバージョンを確認し、それに合わせて-v7または-v6を選択します。例えば、Matlab 7.0 (R14) から R2020a までのバージョンで読み込む必要がある場合は-v7、それよりもさらに古いバージョン(R13など)で読み込む必要がある場合は-v6を選択します。
  • 2GBを超える巨大なデータを扱う場合: 必ず-v7.3を選択する必要があります。
  • パフォーマンスが重視される小規模なデータ: 場合によっては-v7の方が高速な場合がありますが、多くの場合-v7.3でも十分高速です。まずはデフォルト(-v7.3)を試してみて、パフォーマンスに問題があれば他の形式を検討すると良いでしょう。

保存形式を指定する構文は以下のようになります。

matlab
save('filename.mat', 'var1', 'var2', ..., '-v7.3'); % v7.3形式で保存
save('filename.mat', 'var1', '-v7'); % v7形式で保存 (指定した変数のみ)
save('filename.mat', '-v6'); % v6形式で保存 (すべての変数)

-appendオプションと-vNオプションを同時に使うことも可能ですが、-appendは指定したバージョン形式が既存ファイルと一致している場合にのみ推奨されます。異なるバージョン間で-appendを使うと予期しない結果になる可能性があります。特に、v7.3形式で保存されたファイルに、v7形式やv6形式で-appendすることはできません。

2.2. テキスト形式(ASCII)での保存:-asciiオプション

MATファイルはMatlabにとって最も効率的な形式ですが、Matlab以外のソフトウェアでデータを利用したい場合や、ファイルの内容をテキストエディタで確認したい場合には不向きです。このような場合に、saveコマンドはデータをテキスト形式(プレーンテキスト)で保存する機能を提供します。これには-asciiオプションを使用します。

-asciiオプションを使うと、ワークスペースの数値データ(行列、ベクトル、スカラー)が、空白、タブ、または指定した区切り文字で区切られたテキストとしてファイルに書き出されます。

“`matlab
% 数値データを作成
my_matrix = [1.23 4.56; 7.89 10.11];
my_vector = [10 20 30];

% デフォルトのASCII形式で保存 (スペース区切り、8桁の精度)
save(‘numeric_data.txt’, ‘my_matrix’, ‘-ascii’);
% または
save numeric_data.txt my_matrix -ascii;

% 複数の変数をASCII形式で保存しようとするとエラーになります!
% save(‘multiple_vars.txt’, ‘my_matrix’, ‘my_vector’, ‘-ascii’); % これはエラーになります
“`

重要な注意点: -asciiオプションを使用する場合、saveコマンドで指定できる変数は1つだけです。複数の変数を一度にASCII形式で保存することはできません。複数の数値を保存したい場合は、それらを結合して一つの行列(またはベクトル)にしてから保存する必要があります。

また、-asciiオプションは数値データにのみ有効です。文字配列、セル配列、構造体、論理配列、オブジェクトなどの非数値データは、-asciiオプションでは保存できません。これらのデータを含む変数を指定した場合、エラーが発生するか、あるいは変数が無視される可能性があります。

テキスト形式での区切り文字と精度の指定

-asciiオプションには、保存される数値の形式をさらに制御するためのオプションがあります。

  • -ascii -double: 数値を倍精度浮動小数点形式で保存します(通常15桁の精度)。デフォルトの-asciiよりも高い精度で保存できます。
  • -ascii -tabs: 数値をタブ区切りで保存します。デフォルトはスペース区切りです。
  • -ascii -delim Char: 指定した文字Charを区切り文字として使用します。例えば、-delim ','とすればCSV形式のようなカンマ区切りで保存できます。

これらのオプションは組み合わせて使用できます。

“`matlab
% 高精度でタブ区切りで保存
save(‘high_precision_tabs.txt’, ‘my_matrix’, ‘-ascii’, ‘-double’, ‘-tabs’);

% カンマ区切りで保存 (CSV風)
save(‘comma_separated.csv’, ‘my_matrix’, ‘-ascii’, ‘-double’, ‘-delim’, ‘,’);
“`

-asciiオプションはシンプルで互換性の高い形式ですが、以下のような制限や考慮事項があります。

  • 単一変数のみ: 保存できる変数は1つだけです。
  • 数値データのみ: 数値以外のデータ型は保存できません。
  • 精度: デフォルトの-asciiは8桁の精度で保存され、元のデータよりも精度が失われる可能性があります。より高い精度が必要な場合は-doubleを使用します。
  • 構造: 行列、ベクトル、スカラー以外の構造(構造体、セル配列など)は再現できません。保存されるのは数値のグリッドだけです。
  • ファイルサイズ: バイナリ形式のMATファイルに比べて、テキストファイルはファイルサイズが大きくなる傾向があります。

これらの制限があるため、save -asciiは主に、小さな数値データセットを他のソフトウェアと共有したい場合や、簡単な数値テーブルとして保存したい場合に適しています。より複雑なデータや大規模な数値をテキスト形式で保存したい場合は、csvwrite, writematrix, fprintfなどの他のMatlab関数を検討する必要があります。

2.3. 明示的にMAT形式を指定する:-matオプション

saveコマンドは、指定したファイル名に拡張子.matが付いている場合、またはファイル形式オプション(-ascii, -vN)が指定されていない場合に、デフォルトでMAT形式で保存します。しかし、ファイル名の拡張子が.txt.datなどであっても、MAT形式で保存したい場合があるかもしれません。このような場合は、-matオプションを明示的に指定します。

matlab
% ファイル名が .txt でもMAT形式で保存したい場合
my_var = [1 2; 3 4];
save('my_mat_data.txt', 'my_var', '-mat');

このコマンドは、my_mat_data.txtという名前で、my_var変数をMAT形式(デフォルトバージョン)で保存します。ファイル名に.txtが付いていても、中身はMATファイルです。これはあまり一般的な使い方ではありませんが、特定のファイル名規則に従う必要がある場合に役立つ可能性があります。

通常は、MATファイルには.mat拡張子を付け、-matオプションは省略するのが一般的です。ファイル名に.mat拡張子が付いていれば、Matlabは自動的にMAT形式で保存しようとします。

3. MATファイルの内容を確認する:whos -file

MATファイルを保存した後、そのファイルにどのような変数が保存されているのか、それぞれの変数のサイズや型は何か、ファイルサイズはどれくらいかなどを確認したい場合があります。whosコマンドに-fileオプションを付けて、ファイル名を引数として指定することで、この情報を得ることができます。

“`matlab
% いくつかの変数を保存したMATファイルがあるとする
% 例: save(‘my_data.mat’, ‘var1’, ‘var2’);

% my_data.mat ファイルの内容を確認
whos -file my_data.mat
“`

このコマンドを実行すると、my_data.matファイルに保存されている各変数について、ワークスペースでwhosコマンドを実行したときと同様の情報(Name, Size, Bytes, Class, Attributesなど)が表示されます。

matlab
% 実行例の出力 (内容はファイルによる)
% Name Size Bytes Class Attributes
% var1 10x10 800 double
% var2 1x20 40 char

この情報は、ファイルを実際にメモリに読み込む前に、ファイルの内容を把握し、必要な変数だけを読み込むかどうかを判断するのに非常に役立ちます。特に大きなファイルの場合、事前に内容を確認することで、不要なデータ読み込みによるメモリ不足や時間浪費を防ぐことができます。

4. 部分読み込み (MATファイル v7.3):matfile関数

前述の通り、MATファイル形式のv7.3はHDF5に基づいており、ファイル全体や特定の変数全体をメモリに読み込むことなく、ファイル内の特定の部分にアクセスできるという大きなメリットがあります。これは、matfile関数を使って実現します。

matfile関数は、MATファイルへの参照(オブジェクト)を作成します。このオブジェクトを通して、ファイル内の変数にアクセスできますが、これは遅延アクセスです。つまり、実際にその変数や変数の一部にアクセスしようとするまで、データはメモリに読み込まれません。

“`matlab
% 大きな行列と小さなベクトルをv7.3形式で保存
large_matrix = rand(5000, 5000); % 2500万要素、doubleで約200MB
small_vector = 1:10;
save(‘huge_file.mat’, ‘large_matrix’, ‘small_vector’, ‘-v7.3’);

% ファイルへの参照を作成(データはまだ読み込まれない)
mf = matfile(‘huge_file.mat’);

% ファイル内の変数名を確認 (mfオブジェクトのプロパティとしてアクセス可能)
variable_names = who(mf);
disp(variable_names);
% 出力例: {‘large_matrix’, ‘small_vector’}

% small_vector の内容だけを読み込む (巨大な large_matrix は読み込まれない)
small_data = mf.small_vector;
disp(small_data); % small_vector の内容が表示される

% large_matrix の一部だけを読み込む (例えば最初の10×10要素)
partial_data = mf.large_matrix(1:10, 1:10);
disp(partial_data); % large_matrix の左上10×10が表示される

% 注意: 変数全体を読み込むことも可能だが、巨大な場合はメモリ注意
% all_large_data = mf.large_matrix; % 巨大な場合はメモリを大量に消費
“`

matfileオブジェクトを通して変数にアクセスする場合、.VariableNameのようにドット表記を使用します。配列や行列の場合、インデックスを指定してその一部だけを読み込むことができます(例: mf.large_matrix(rows, cols))。これは、巨大な画像ファイルやシミュレーション結果の一部だけを分析したい場合に非常に効率的です。

loadコマンドで特定の変数だけを読み込む(例: load('huge_file.mat', 'small_vector');)ことも可能ですが、これは指定した変数全体をメモリに読み込みます。一方、matfileを使えば、変数全体ではなく、その変数内の一部の要素だけを読み込むことができます。これが大規模データにおいてmatfileが特に有用な理由です。

matfile関数は、ファイルへの書き込みも部分的に行うことができます。

matlab
% large_matrix の左上 10x10 の値を更新してファイルに書き戻す
mf.large_matrix(1:10, 1:10) = zeros(10, 10); % ファイルの一部を更新

このように、matfile関数とv7.3形式の組み合わせは、Matlabで大規模データセットを扱う際の強力なツールとなります。

5. 高度な使い方と注意点

saveコマンドを使用する際に知っておくべき、より高度なトピックや注意点があります。

5.1. 作業ディレクトリ (pwd) とパス

saveコマンドでファイル名を指定する場合、特にパスを指定しない場合は、ファイルは現在のMatlabの作業ディレクトリ (pwdコマンドで確認) に保存されます。

“`matlab
% 現在の作業ディレクトリを確認
current_dir = pwd;
disp([‘現在の作業ディレクトリ: ‘, current_dir]);

% ファイル名を指定して保存 (現在のディレクトリに保存される)
save(‘my_data.mat’, ‘my_variable’);
“`

特定のディレクトリに保存したい場合は、ファイル名に相対パスまたは絶対パスを含めて指定する必要があります。

“`matlab
% 相対パスを指定して保存
% (例: 現在のディレクトリの親ディレクトリにある ‘data_archive’ フォルダに保存)
save(‘../data_archive/my_data.mat’, ‘my_variable’);

% 絶対パスを指定して保存 (Windowsの場合)
save(‘C:\Users\YourName\Documents\MatlabData\my_data.mat’, ‘my_variable’);

% 絶対パスを指定して保存 (macOS/Linuxの場合)
save(‘/Users/YourName/Documents/MatlabData/my_data.mat’, ‘my_variable’);
“`

パスを指定する際は、オペレーティングシステムに応じた区切り文字(Windowsでは\、macOS/Linuxでは/)を使用するか、Matlabがクロスプラットフォームで認識できる/を使用するのが一般的です。

存在しないディレクトリに保存しようとすると、Matlabは通常エラーを報告します。保存先のディレクトリが確実に存在することを確認するか、必要に応じてmkdirコマンドで事前にディレクトリを作成しておく必要があります。

“`matlab
% 保存先ディレクトリ
save_dir = ‘../results/analysis_date/’;

% ディレクトリが存在するかチェックし、なければ作成
if ~exist(save_dir, ‘dir’)
mkdir(save_dir);
disp([‘ディレクトリを作成しました: ‘, save_dir]);
end

% そのディレクトリにファイルを保存
save([save_dir, ‘final_results.mat’], ‘final_variable’);
``
ファイル名とパスを結合する際は、
fullfile`関数を使用すると、OSに応じた正しい区切り文字を使って安全にパスを作成できます。

“`matlab
save_dir = ‘../results/analysis_date/’;
filename = ‘final_results.mat’;
full_path = fullfile(save_dir, filename);

% パスを結合して保存
save(full_path, ‘final_variable’);
“`

5.2. 自動的な.mat拡張子の付与

saveコマンドでファイル名を指定する際、.mat拡張子を付けても付けなくても、Matlabは通常自動的に.mat拡張子を付与します(ただし、ファイル名にピリオドが含まれている場合や、-asciiなどの形式オプションが指定されている場合は挙動が異なることがあります)。

“`matlab
% 拡張子なしで指定
save(‘my_file’, ‘my_var’); % -> my_file.mat が作成される

% 拡張子付きで指定
save(‘my_file.mat’, ‘my_var’); % -> my_file.mat が作成される
“`

明示的に.mat拡張子を付けて指定するのが最も確実で推奨される方法です。これにより、意図しないファイル名や拡張子で保存されることを防げます。

5.3. 変数名の長さ制限 (古い形式)

古いMATファイル形式(特にv6)では、保存できる変数名に長さの制限がありました(通常31文字)。現在のMatlabバージョンやv7、v7.3形式ではこの制限は緩和されていますが、古いバージョンとの互換性を保つために-v6で保存する場合や、ファイル名の長さ制限を意識しないと、読み込み時に問題が発生する可能性があります。

5.4. 巨大なデータを保存する場合の考慮事項

巨大なデータ(数百MBから数GB以上)を扱う場合は、以下の点を考慮する必要があります。

  • 保存形式: 2GBを超えるデータはv7.3形式でしか保存できません。それ以下のデータでも、v7.3は部分読み込みが可能なので、巨大なデータの一部だけを読み込む可能性がある場合はv7.3が有利です。
  • ディスク容量: 保存するデータのサイズに加えて、ファイル形式によってはヘッダー情報などのオーバーヘッドが発生するため、必要なディスク容量を事前に確認してください。
  • 保存時間: 巨大なデータの保存には時間がかかります。スクリプトや関数の中で保存を行う場合は、処理時間に余裕を持つ必要があります。
  • メモリ: saveコマンド自体は、保存する変数が必要とするメモリを一時的に消費します。特にすべての変数を保存する場合 (save filename;) は、ワークスペース全体のサイズに注意が必要です。matfileを使った部分書き込みは、メモリ消費を抑えるのに役立ちます。
  • パフォーマンス: ネットワークドライブへの保存は、ローカルドライブへの保存よりも大幅に遅くなる可能性があります。可能な限り高速なストレージ(SSDなど)への保存を検討してください。

5.5. データの型と精度 (-asciiの場合)

-asciiオプションで数値を保存する場合、デフォルトでは8桁の精度で保存されます。元のデータが倍精度(double、約15桁)や単精度(single、約7桁)の場合、デフォルトの-asciiで保存すると精度が失われます。高い精度が必要な場合は、必ず-doubleオプションを使用してください。

“`matlab
% 高精度なデータ
high_precision_var = pi; % piは約3.141592653589793

% デフォルトの -ascii で保存 (精度が失われる)
save(‘low_precision.txt’, ‘high_precision_var’, ‘-ascii’);
% low_precision.txt の内容は ‘3.1415927’ のようになる可能性 (8桁)

% -ascii -double で保存 (高い精度を維持)
save(‘high_precision.txt’, ‘high_precision_var’, ‘-ascii’, ‘-double’);
% high_precision.txt の内容は ‘3.141592653589793e+00’ のようになる可能性 (約15桁)
“`

MATファイル形式の場合は、元のデータの型(double, single, integerなど)とその精度がそのまま保存されます。

5.6. 国際化 (ファイル名、変数名)

Matlabの新しいバージョンでは、MATファイル形式(特にv7.3)やファイル名において、Unicode文字(日本語、中国語などの非ラテン文字)をサポートしています。しかし、古いMatlabバージョンとの互換性を確保したい場合や、他のソフトウェアとの連携を考慮する場合は、ASCII文字(半角英数字と一部の記号)のみでファイル名や変数名を付けるのが最も安全です。

5.7. エラーハンドリング (try-catch)

ファイル保存中にディスク容量不足、パス指定ミス、権限不足などのエラーが発生する可能性があります。重要なデータを保存する場合は、try-catchブロックを使用してエラーハンドリングを実装することを検討してください。

“`matlab
my_variable = rand(100);
save_path = ‘/non_existent_dir/my_data.mat’; % 意図的に存在しないパス

try
save(save_path, ‘my_variable’);
disp([‘データを保存しました: ‘, save_path]);
catch ME
% エラーメッセージを表示
warning([‘データ保存中にエラーが発生しました: ‘, ME.message]);
% エラーの種類によって追加の処理を行うことも可能
% if strcmp(ME.identifier, ‘MATLAB:save:couldNotWriteFile’)
% disp(‘ファイルへの書き込み権限がないか、パスが間違っています。’);
% end
end
“`

これにより、エラーが発生してもスクリプト全体が中断されるのを防ぎ、問題に対処するためのメッセージを表示したり、代替処理を行ったりすることができます。

6. saveコマンドの制限と代替手段

saveコマンドは非常に便利ですが、すべてのデータ保存タスクに適しているわけではありません。Matlabには、特定のデータ型やファイル形式に対応するための他の保存関数も用意されています。

6.1. 複雑なデータ構造の保存

MATファイル形式は、数値配列、文字配列、構造体、セル配列、テーブル、時系列データ、マップ、オブジェクトなど、Matlabがサポートするほとんどのデータ型を保存できます。saveコマンドは、これらの複雑なデータ構造を含む変数をMATファイルに保存するのに最適です。

“`matlab
% 複雑なデータ構造
my_struct = struct(‘name’, ‘Experiment A’, ‘data’, rand(50, 10), ‘settings’, containers.Map({‘gain’, ‘filter’}, {100, ‘lowpass’}));
my_cell = {‘Header’, [1 2; 3 4], ‘Note’};
my_table = array2table(rand(5, 3), ‘VariableNames’, {‘Var1’, ‘Var2’, ‘Var3’});

% これらはMATファイルで保存するのが最も自然
save(‘complex_data.mat’, ‘my_struct’, ‘my_cell’, ‘my_table’);

% -asciiでは保存できません
% save(‘complex_data.txt’, ‘my_struct’, ‘-ascii’); % エラーまたは警告
“`

関数ハンドル、匿名関数、クラスオブジェクトも、MAT形式(通常v7以降)で保存し、後で読み込むことができます。ただし、関数やオブジェクトの定義自体が変更された場合、古いファイルから読み込んだものが正しく動作しない可能性があります。

6.2. 他のファイル形式での保存

テキスト形式(CSV、TSVなど)や画像ファイル形式(JPEG, PNG, TIFFなど)、音声ファイル形式、Excelファイル形式など、特定のファイル形式でデータを保存したい場合は、saveコマンドの-asciiオプションでは不十分な場合が多く、より特化した関数を使用する必要があります。

  • 数値配列をテキストファイルに:
    • writematrix: R2019aで導入された推奨関数。区切り文字、書式などを柔軟に指定でき、セル配列やテーブルも扱える場合がある。
    • csvwrite: 数値行列をカンマ区切りのCSVファイルとして保存する(非推奨)。
    • dlmwrite: 数値行列を指定した区切り文字(delimiter)でテキストファイルに保存する(非推奨)。
    • fprintf: C言語のfprintfに似た関数。高度な書式設定が必要な場合や、非数値データを混在させてテキストファイルに書き出したい場合に使用する。
  • テーブルをファイルに:
    • writetable: テーブルオブジェクトをCSV、Excel、テキストファイルなどに保存する。推奨関数。
  • 画像をファイルに:
    • imwrite: 行列や配列を画像ファイル(JPEG, PNG, TIFF, BMPなど)として保存する。
  • 音声をファイルに:
    • audiowrite: サンプルレートと波形データを音声ファイル(WAV, FLACなど)として保存する。
  • Excelファイルを読み書き:
    • readcell, readmatrix, readtable, readvars (読み込み)
    • writecell, writematrix, writetable, writevars (書き込み)

これらの関数は、それぞれのファイル形式の仕様に合わせてデータを適切に整形して保存します。saveコマンドは主にMatlab固有のMAT形式によるデータ永続化に使われると理解しておくと良いでしょう。-asciiオプションは、MAT形式を読み込めないシンプルな数値データ交換のための機能として位置づけられます。

7. ベストプラクティス:賢いデータ保存のために

Matlabでのデータ保存を効率的かつ安全に行うために、いくつかのベストプラクティスを紹介します。

  1. ファイル名に意味を持たせる: 保存するデータの内容(実験名、日付、シミュレーション条件など)がわかるようなファイル名を付けましょう。save analysis_20231027_expA_params.mat のように、情報を詰め込むと後で管理しやすくなります。
  2. どの変数を保存するかを意識する: 特に理由がない限り、save filename;のようにワークスペースのすべてを保存するのではなく、必要な変数だけを選んで保存しましょう(save filename var1 var2;)。これによりファイルサイズを小さく抑え、読み込み時間を短縮できます。一時的な変数や巨大な中間結果は保存しないようにします。
  3. 適切な保存形式を選択する:
    • Matlabでの再利用が主で、互換性や大規模データ対応が必要な場合はMAT形式(特にv7.3)。
    • 他のソフトウェアとの数値データ交換や、シンプルなテキスト編集が必要な場合は-ascii(ただし制限に注意)。
    • より複雑なテキスト形式や特定のバイナリ形式が必要な場合は、writetable, imwriteなどの専用関数を使う。
  4. 大きなデータを扱う場合の注意: 巨大なデータ(2GB超)はv7.3形式で保存し、読み込み時にはmatfile関数を使って部分読み込みを検討しましょう。保存前には十分なディスク容量があるか確認します。
  5. 保存前にデータの確認: whosコマンドを使って、保存しようとしている変数のサイズや型を事前に確認する習慣をつけましょう。特に巨大な変数を保存しようとしていないか、意図しない変数まで保存対象になっていないかを確認します。
  6. パスの管理: ファイルを保存する際は、現在の作業ディレクトリに保存するのか、特定のデータディレクトリに保存するのかを意識し、必要に応じて相対パスまたは絶対パスを適切に指定します。fullfile関数を使うとパスの指定がより安全になります。
  7. エラーハンドリング: 重要なデータを保存する場合は、ファイル保存が失敗した場合に備えてtry-catchブロックによるエラーハンドリングを導入することを検討します。
  8. バージョンの互換性を考慮: 異なるMatlabバージョン間でファイルをやり取りする可能性がある場合は、読み込む側のMatlabバージョンがサポートする最も新しい形式を選択します。

これらのベストプラクティスに従うことで、データの喪失を防ぎ、効率的なデータ管理を実現できます。

8. よくある質問 (FAQ)

Q1: saveloadはどう対応していますか?

saveコマンドで保存されたMATファイルは、対応するloadコマンドで読み込むことができます。

  • save filename; で保存したすべての変数は、load filename; でワークスペースに読み込まれます。
  • save filename var1 var2; で保存した特定の変数は、load filename; または load filename var1 var2; で読み込むことができます。load filename var1; のように、保存された変数の一部だけを読み込むことも可能です。
  • MATファイル(v7.3形式)に保存されたデータは、matfile関数を使って部分的にアクセスすることも可能です。
  • -asciiオプションで保存されたテキストファイルは、load filename -ascii; で行列として読み込むことができます。ただし、元のデータが複数変数であったり、数値以外のデータを含んでいたりした場合、load -asciiでは元の構造は再現されません。また、textscan, readmatrix, readtableなど、テキストファイル読み込み用のより高機能な関数を使うことも一般的です。

Q2: 異なるMatlabバージョン間でのMATファイルの互換性はありますか?

はい、MATファイル形式には互換性がありますが、バージョンによる制限があります。

  • 新しいバージョンで保存されたMATファイルは、古いバージョンでは読み込めないことが多いです(特にv7.3形式)。
  • 古いバージョンで保存されたMATファイルは、新しいバージョンで通常読み込めます
  • 異なるMatlabバージョン間でファイルを共有する場合は、読み込む側のMatlabバージョンがサポートする最も新しい形式(例: R2006a以前が必要ならv6、R2020a以前が必要ならv7など)で保存するのが安全です。

Q3: saveしたはずの変数が見つかりません。なぜですか?

いくつかの可能性があります。

  • ファイル名を間違えている: 保存したファイル名やパスが、読み込もうとしているファイル名やパスと異なっている。pwdで現在のディレクトリを確認し、dirやOSのファイルエクスプローラーでファイルが存在するか確認してください。
  • 別のディレクトリに保存した: ファイルを保存したディレクトリと、loadコマンドを実行しているディレクトリが異なる。loadコマンドでフルパスまたは相対パスを指定する必要があります。
  • 別の変数名で保存した: save filename var1 var2;のように特定の変数だけを保存した場合、指定した変数名以外はファイルに含まれていません。whos -file filename;でファイルに含まれる変数名を確認してください。
  • -asciiで保存した: -asciiで保存した場合、元の変数名や構造は失われ、単純な数値のグリッドとして保存されます。load filename -ascii;で読み込むと、ファイル名と同じ名前の変数(例: filename)に行列として読み込まれます。
  • 変数が存在しなかった: save実行時に、指定した変数名がワークスペースに存在しなかった場合、その変数は保存されません(エラーにならない場合が多いので注意)。

Q4: 保存に時間がかかる、またはファイルサイズが大きすぎます。

以下の点を検討してください。

  • 保存する変数: 不要な変数(特に巨大な中間結果)を保存していませんか?必要な変数だけを選んで保存しましょう。
  • 保存形式: v7.3形式は部分読み込みに強いですが、ファイルサイズが大きくなる傾向があります。データが2GB未満で、部分読み込みの必要がない場合は、v7形式を試してみてください。ただし、R2020b以降のデフォルトはv7.3です。
  • データの型: 数値データが不必要に高精度(例: 全てdouble)になっていませんか?必要に応じて単精度(single)や整数型(int8, int16など)に変換すると、ファイルサイズを削減できます。
  • 圧縮: MATファイル形式はデータによっては自動的に圧縮されますが、データの性質(ランダム性など)によってはあまり圧縮されない場合もあります。
  • 保存場所: ネットワークドライブへの保存は遅いです。ローカルドライブへの保存を検討しましょう。
  • ハードウェア: 高速なストレージ(SSD)を使用すると、読み書き速度が向上します。

9. まとめ:saveコマンドをデータ管理の味方に

この記事では、Matlabのsaveコマンドについて、その基本的な使い方から、特定の変数の保存、ワイルドカードの使用、既存ファイルへの追加 (-append)、そして最も重要な保存形式(MAT形式の各バージョン-vNとテキスト形式-ascii)の指定方法まで、詳しく解説しました。

また、保存されたMATファイルの内容を確認する方法 (whos -file) や、v7.3形式の大きな利点であるmatfile関数を使った部分読み込みについても触れました。さらに、パス指定、拡張子の自動付与、変数名制限、巨大データや精度に関する考慮事項、エラーハンドリングといった高度なトピックや注意点、そしてsaveコマンドの制限と他の保存関数の使い分けについても議論しました。

saveコマンドは、Matlabでの作業結果を永続化し、後で再利用可能にするための基盤となるツールです。その多様なオプションを理解し、データの性質や目的に応じて適切に使い分けることで、より効率的で信頼性の高いデータ管理が可能になります。

この記事で解説した内容を参考に、あなたのMatlabワークフローに合った最適なsaveコマンドの使い方を見つけてください。データの適切な保存は、分析や研究の再現性を高め、将来の作業をスムーズに進めるための重要なステップです。

10. 参考資料


これで、Matlabのsaveコマンドに関する約5000語の詳細な解説記事となります。基本的な使い方から応用、注意点、ベストプラクティスまでを網羅し、具体的なコード例を多数含めるよう努めました。読者がsaveコマンドを深く理解し、効果的に使えるようになる助けとなれば幸いです。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール