Octaveプログラミング初心者必見!「load」コマンド活用術と実践例

2025-06-06

Octaveのloadコマンドは、主に以下の2つの目的で使用されます。

  1. 保存された変数(データ)の読み込み: saveコマンドでファイルに保存されたOctaveの変数(行列、ベクトル、スカラなど)を、現在のワークスペースに読み込むために使用されます。
  2. 実行可能なスクリプトファイルの読み込みと実行: Octaveのスクリプトファイル(.mファイル)を読み込み、その中のコマンドを実行するために使用されます。ただし、スクリプトの実行には通常はファイル名を直接入力するかsourceコマンドを使うことが一般的です。

保存された変数(データ)の読み込み

これがloadコマンドの最も一般的な使用方法です。

基本的な使い方

load filename
  • filename: 読み込みたいデータが保存されているファイルの名前を指定します。拡張子を省略すると、Octaveはまず.mat、次に.oct、そして他の形式のファイルを探します。


例えば、あなたが以前にmy_data.matというファイルに変数ABを保存したとします。

% 以前に保存したと仮定
A = [1 2; 3 4];
B = "hello";
save my_data.mat A B

このmy_data.matを読み込むには、次のようにします。

load my_data.mat

このコマンドを実行すると、my_data.matに保存されていた変数ABが現在のOctaveのワークスペースに復元されます。whosコマンドで確認できます。

whos
% 変数 A と B が表示されるはずです

特定の変数を読み込む場合

ファイル全体ではなく、ファイル内に保存されている特定の変数のみを読み込みたい場合は、以下のように指定します。

load filename variable1 variable2 ...


my_data.matから変数Aだけを読み込みたい場合。

load my_data.mat A

サポートされるファイル形式

loadコマンドは、様々なファイル形式をサポートしています。

  • テキスト形式
    • プレーンテキストファイル(スペース区切り、タブ区切り、CSVなど)。
    • 特定の形式のファイル(例: load -ascii filename でASCII形式のデータを読み込む)。
  • Octave独自の形式
    • .mat: MATLAB互換のバイナリ形式。これが最も一般的です。
    • .oct: Octave独自のバイナリ形式。

例(テキストファイルからの読み込み)

data.txtというファイルに以下の数値データがあるとします。

1.0 2.0 3.0
4.0 5.0 6.0

これを読み込むには、loadコマンドを単独で使うと、ファイル名と同じ名前の行列としてワークスペースに読み込まれます。

load data.txt
% これにより 'data' という名前の行列が作成されます
% data
%  =
%    1   2   3
%    4   5   6

または、より明示的にASCII形式として読み込むこともできます。

load -ascii data.txt

実行可能なスクリプトファイルの読み込みと実行

loadコマンドは、Octaveスクリプトファイル(.mファイル)を読み込み、その中のコマンドを実行することもできます。しかし、通常スクリプトを実行する場合は、ファイル名を直接コマンドラインに入力するか、sourceコマンドを使用する方が一般的です。


my_script.mというファイルに以下の内容が書かれているとします。

disp("Hello from my_script!");
x = 10;

これをloadで実行できます。

load my_script.m
% "Hello from my_script!" と表示され、x に 10 が代入されます

しかし、前述の通り、これはスクリプトを実行する一般的な方法ではありません。通常は以下のようにします。

my_script % ファイル名を直接入力
% または
source("my_script.m")


loadコマンドは、ファイルからデータや変数を読み込むために使用されますが、その際に様々な問題が発生する可能性があります。

ファイルが見つからない (File not found)

エラーメッセージの例

error: load: unable to open file 'non_existent_file.mat'

原因

  • 大文字/小文字の区別を間違えている(特にLinuxなどのUnix系OSの場合)。
  • ファイル名に誤字脱字がある。
  • ファイルがパス上にない。
  • 現在の作業ディレクトリ(カレントディレクトリ)にファイルがない。
  • ファイルが存在しない。
  • 指定されたファイル名が間違っている。

トラブルシューティング

  1. ファイル名の確認
    • ファイル名が正確であることを再確認してください(拡張子も含む)。
    • 例: my_data.mat と入力すべきところを mydata.mat と入力していないか。
  2. カレントディレクトリの確認
    • pwd コマンドで現在の作業ディレクトリを確認し、ファイルがそこにあるかを確認します。
    • ls または dir コマンドで、現在のディレクトリ内のファイルリストを確認し、目的のファイルが存在するかを確認します。
  3. パスの確認
    • ファイルがカレントディレクトリにない場合、そのファイルが存在するディレクトリへの完全なパスを指定する必要があります。
    • 例: load /home/user/documents/my_data.mat (Linux/macOS) または load C:\Users\user\Documents\my_data.mat (Windows)
    • または、addpath コマンドを使って、そのディレクトリをOctaveの検索パスに追加することもできます。
      addpath('/home/user/documents') % または 'C:\Users\user\Documents'
      load my_data.mat
      
    • path コマンドで現在の検索パスを確認できます。
  4. 大文字/小文字の区別
    • ファイルシステムによっては、ファイル名の大文字/小文字が区別されます(例: Linux)。MyData.matmydata.mat は異なるファイルとして扱われます。正確なファイル名を指定してください。

ファイル形式の不一致 (File format mismatch)

エラーメッセージの例

error: load: expecting binary file
error: load: unable to read matrix from file 'my_text_data.mat'

原因

  • もし、読み込もうとしているファイルがプレーンテキストファイル(CSV、スペース区切りなど)である場合、このエラーが発生します。
  • loadコマンドは、デフォルトでOctaveやMATLABのバイナリ形式(.mat.oct)のファイルを読み込もうとします。

トラブルシューティング

  1. テキストファイルとしての読み込み
    • プレーンテキストファイルから数値データを読み込む場合は、-ascii オプションを使用します。これにより、ファイル全体が1つの行列として読み込まれます。
      load -ascii my_text_data.txt
      
    • または、csvreaddlmreadtextreadtextscan といった関数を使用して、より柔軟にテキストデータを読み込むことができます。これらは、特定のデリミタ(区切り文字)やデータ型を指定するのに適しています。
      % CSVファイルの場合
      data = csvread('my_csv_data.csv');
      
      % 区切り文字がスペースやタブの場合
      data = dlmread('my_delimited_data.txt', ' '); % スペース区切り
      
      % 複雑なテキストファイルの場合
      fid = fopen('my_complex_data.txt', 'r');
      C = textscan(fid, '%s %f %d', 'Delimiter', ','); % 文字列、浮動小数点、整数をカンマ区切りで読み込む例
      fclose(fid);
      

不完全または破損したファイル (Incomplete or corrupted file)

エラーメッセージの例

error: load: error reading file 'corrupted_data.mat'
error: load: unexpected end of file

原因

  • 異なるバージョンのOctaveやMATLABで作成されたファイルであり、互換性がない。
  • ファイルが外部要因(ディスクエラー、転送中の破損など)によって破損した。
  • 保存時にエラーが発生し、ファイルが不完全になった。

トラブルシューティング

  1. ファイルの再保存
    • 可能であれば、元の環境でファイルを再度saveコマンドで保存し直してください。
  2. ファイルの健全性チェック
    • ファイルサイズが極端に小さい場合や、他のプログラムで開こうとしてエラーになる場合は、ファイルが破損している可能性があります。
  3. バージョン互換性の確認
    • 異なるバージョンのOctaveやMATLAB間でファイルをやり取りする場合、saveコマンドで特定のバージョン形式を指定することで互換性を高めることができます。
      • MATLAB互換のバージョン7形式で保存: save -v7 my_data.mat A B
      • Octaveのデフォルト形式で保存: save -octave my_data.oct A B
      • 古いバージョンのMATLABで読み込める形式: save -v6 my_data.mat A B

変数の読み込み失敗 (Variable not found after loading / Undefined variable)

原因

  • テキストファイルをloadした場合、そのファイル名が変数名として自動的に使用されるが、そのファイル名と異なる名前で変数にアクセスしようとしている。
  • load filename variable_name のように特定の変数を指定して読み込んだが、その変数がファイル内に存在しない。

トラブルシューティング

  1. ファイル内の変数を確認
    • load filename のように引数なしでファイルを読み込み、whos コマンドでワークスペース内の変数をリスト表示し、意図した変数が読み込まれているか確認します。
    • もしファイルに複数の変数が保存されている場合、すべての変数がワークスペースに読み込まれます。
  2. テキストファイルの読み込みと変数への代入
    • テキストファイルを読み込む場合、通常はファイル名がそのまま変数名になります。
      load mydata.txt % この場合、`mydata`という名前の行列が作成される
      
    • もし別の変数名で受け取りたい場合は、明示的に代入します。
      my_variable = load('mydata.txt');
      

スクリプトファイルの実行に関する問題 (Issues with executing script files)

原因

  • スクリプト内でエラーが発生している場合、loadコマンドの問題ではなく、スクリプト自体の問題です。
  • load コマンドはスクリプトファイル(.mファイル)も実行できますが、通常はファイル名を直接入力するか、source コマンドを使用する方が推奨されます。
  1. スクリプトを直接実行
    • ファイル名を入力してスクリプトを実行し、エラーメッセージを直接確認します。
      my_script % my_script.m を実行
      
    • エラーメッセージは、スクリプトのどの行で問題が発生したかを示すことが多いので、それに基づいてスクリプトをデバッグします。


loadコマンドは、主にデータファイルの読み込みと、場合によってはスクリプトファイルの実行に使われます。ここでは、それぞれの主要な使い方について具体的なコード例を挙げ、その動作を解説します。

例1: バイナリ形式のデータファイル(.mat)の保存と読み込み

これがloadコマンドの最も一般的な使用例です。Octave(およびMATLAB)で作成された変数をファイルに保存し、後で読み込む場合です。

ステップ1: データを保存するスクリプト (save_data_example.m)

% save_data_example.m

% 変数Aを作成
A = [1 2 3; 4 5 6; 7 8 9];

% 変数Bを作成
B = {'Apple', 'Banana', 'Cherry'};

% スカラ値の変数Cを作成
C = pi;

% これらの変数を 'my_variables.mat' というファイルに保存
% '-v7' オプションはMATLAB R2007b以降と互換性のある形式で保存します。
% Octaveのデフォルトは通常 -v7 形式ですが、明示的に指定することで互換性を高めます。
save my_variables.mat A B C -v7;

disp('データが my_variables.mat に保存されました。');
disp(['保存された変数: A (' mat2str(size(A)) '), B (' num2str(length(B)) '要素), C (' num2str(C) ')']);

% ワークスペースをクリアして、変数が存在しない状態にする
clear A B C;
disp('ワークスペースから A, B, C がクリアされました。');
whos; % 変数が存在しないことを確認

実行方法

octave> save_data_example

実行結果

データが my_variables.mat に保存されました。
保存された変数: A (3 3), B (3要素), C (3.14159)
ワークスペースから A, B, C がクリアされました。
variables in the current scope:

ステップ2: 保存されたデータを読み込むスクリプト (load_data_example.m)

% load_data_example.m

disp('my_variables.mat からデータを読み込みます...');

% my_variables.mat ファイルからすべての変数を読み込む
load my_variables.mat;

disp('データが読み込まれました。');

% 読み込まれた変数を確認
whos;

% 読み込まれた変数の内容を表示
disp('変数 A:');
disp(A);

disp('変数 B:');
disp(B);

disp('変数 C:');
disp(C);

% 特定の変数のみを読み込む例 (コメントアウトを解除して試してください)
% clear A B C; % 一度クリア
% load my_variables.mat A C; % A と C のみ読み込む
% whos; % A と C のみが表示されるはず

実行方法

octave> load_data_example

実行結果

my_variables.mat からデータを読み込みます...
データが読み込まれました。
variables in the current scope:

   A         3x3 matrix
   B         1x3 cell array
   C         1x1 scalar

変数 A:
A =
   1   2   3
   4   5   6
   7   8   9
変数 B:
B =
{
  [1,1] = Apple
  [1,2] = Banana
  [1,3] = Cherry
}
変数 C:
C = 3.1416

例2: テキストファイルからの数値データの読み込み

loadコマンドは、プレーンテキストファイルに保存された数値データを読み込むこともできます。この場合、ファイルの内容は一つの行列としてワークスペースに読み込まれます。

ステップ1: テキストデータファイル (data.txt) の作成

メモ帳などのテキストエディタで以下の内容を保存してください。

10 20 30
40 50 60
70 80 90

ステップ2: テキストデータを読み込むスクリプト (load_text_example.m)

% load_text_example.m

disp('data.txt からテキストデータを読み込みます...');

% -ascii オプションを使って、テキストファイルを数値行列として読み込む
% ファイル名と同じ名前の変数 (この場合は 'data') が作成されます
load -ascii data.txt;

disp('データが読み込まれました。');

% 読み込まれた変数を確認
whos;

% 読み込まれた行列の内容を表示
disp('変数 data:');
disp(data);

% 別の変数名で読み込む場合 (コメントアウトを解除して試してください)
% clear data;
% my_matrix = load('-ascii', 'data.txt');
% disp('my_matrix という名前で読み込まれました:');
% disp(my_matrix);

実行方法

octave> load_text_example

実行結果

data.txt からテキストデータを読み込みます...
データが読み込まれました。
variables in the current scope:

   data      3x3 matrix

変数 data:
data =
   10   20   30
   40   50   60
   70   80   90

注意点

  • より複雑なテキストファイル(CSV、特定の区切り文字、ヘッダー行など)を扱う場合は、csvreaddlmreadtextscan といった関数を使用する方が柔軟で強力です。
  • load -ascii は、ファイル全体を単一の数値行列として読み込みます。ファイル内に数値以外の文字や異なるデータ型が混在している場合はエラーになるか、予期せぬ結果になります。

例3: スクリプトファイルとしてのload (非推奨)

loadコマンドは、.mファイルをスクリプトとして実行することもできますが、これは通常推奨されません。スクリプトの実行には、ファイル名を直接入力するか、sourceコマンドを使用するのが一般的です。

ステップ1: 簡単なスクリプトファイル (my_script.m) の作成

% my_script.m

disp('my_script.m が実行されました!');
x = 100;
y = "Hello Octave";

ステップ2: loadを使ったスクリプトの実行 (非推奨)

% load_script_example.m

disp('load コマンドを使ってスクリプトを実行します (非推奨)...');

% my_script.m を実行
load my_script.m;

disp('スクリプトの実行が完了しました。');

% スクリプト内で定義された変数を確認
whos;

disp('変数 x:');
disp(x);
disp('変数 y:');
disp(y);

実行方法

octave> load_script_example

実行結果

load コマンドを使ってスクリプトを実行します (非推奨)...
my_script.m が実行されました!
スクリプトの実行が完了しました。
variables in the current scope:

   x         1x1 scalar
   y         1x1 string

変数 x:
x = 100
変数 y:
y = Hello Octave

推奨されるスクリプトの実行方法

octave> my_script % ファイル名を直接入力

または

octave> source('my_script.m')
  • スクリプトの実行
    技術的には可能だが、loadを使うのは稀で、通常はファイル名やsourceコマンドを使用する。
  • テキストデータの読み込み
    -ascii オプションを使って、数値のみのテキストファイルを読み込む。
  • loadの主な用途
    saveコマンドで保存されたバイナリデータファイル(.mat.oct)の読み込み。これが最も頻繁に使われます。


loadコマンドは非常に便利ですが、特定の種類のデータや、より柔軟な読み込み処理が必要な場合には、他の関数やアプローチが使われます。主な代替方法を以下に示します。

テキストファイルからのデータ読み込みの代替方法

load -ascii はシンプルな数値テキストファイルには便利ですが、より多くの機能が必要な場合は以下の関数が優れています。

a. dlmread / csvread

  • my_csv_data.csv の内容:

    Header1,Header2,Header3
    1.1,2.2,3.3
    4.4,5.5,6.6
    
    % ヘッダー行をスキップして、データ部分のみを読み込む
    data = csvread('my_csv_data.csv', 1, 0); % 1行目から読み込み開始 (0は列)
    disp(data);
    % 出力:
    %    1.1000   2.2000   3.3000
    %    4.4000   5.5000   6.6000
    
  • 構文

    data = dlmread('filename', 'delimiter', R, C);
    data = csvread('filename', R, C); % カンマ区切り専用
    
    • filename: 読み込むファイル名
    • delimiter: 区切り文字(例: ' ''\t'','
    • R: 読み込みを開始する行のインデックス(0から始まる)
    • C: 読み込みを開始する列のインデックス(0から始まる)
  • 特徴

    • 特定の区切り文字(スペース、タブ、カンマなど)を指定できます。
    • 読み込みを開始する行と列を指定できます(ヘッダー行のスキップなどに便利)。
    • ファイル全体を一つの行列として読み込みます。
  • 用途
    区切り文字(デリミタ)で区切られた数値データを含むテキストファイルを読み込むのに最適です。csvreadはカンマ区切りの専用版です。

b. textread / textscan

  • mixed_data.txt の内容:

    ItemA,123,4.5
    ItemB,456,7.8
    
    fid = fopen('mixed_data.txt', 'r');
    % 各行を文字列、整数、浮動小数点としてカンマ区切りで読み込む
    C = textscan(fid, '%s %d %f', 'Delimiter', ',');
    fclose(fid);
    
    item_names = C{1};
    integers = C{2};
    floats = C{3};
    
    disp(item_names);
    disp(integers);
    disp(floats);
    % 出力:
    % {
    %   [1,1] = ItemA
    %   [2,1] = ItemB
    % }
    %    123
    %    456
    %    4.5000
    %    7.8000
    
  • textscan (より強力で推奨される)

    fid = fopen('filename', 'r'); % ファイルを開く
    C = textscan(fid, 'format', N, 'param', value, ...);
    fclose(fid); % ファイルを閉じる
    
    • fid: fopenで開いたファイルID
    • C: セル配列として結果が返されます。
  • textread (古い形式、シンプルだが機能限定的)

    [col1, col2, col3] = textread('filename', 'format', N, 'param', value, ...);
    
  • 特徴

    • フォーマット文字列を使用して、読み込むデータの型(例: %f 浮動小数点、%s 文字列、%d 整数)を指定できます。
    • 複数の変数に異なるデータ型を読み込めます。
    • 区切り文字、コメント文字、繰り返し回数などを細かく制御できます。
  • 用途
    複雑な形式のテキストファイル(数値と文字列が混在、特定のパターンを持つデータ、異なる区切り文字)を読み込むのに非常に強力です。

バイナリ形式のデータ(.mat, .octなど)の読み込みの代替方法

loadコマンドがこれらの形式の標準的な読み込み方法ですが、特定の場合には以下の関数が役立つことがあります。

a. load関数の戻り値を利用する

load関数を直接呼び出すと、ファイル内の変数が現在のワークスペースに展開されます。しかし、load関数を関数の戻り値として使用すると、ファイル内のすべての変数を**構造体(structure)**として読み込むことができます。これは、読み込む変数の名前が不明な場合や、ワークスペースを汚染したくない場合に便利です。


  • my_variables.matAB が保存されていると仮定。

    % データ保存 (例1で作成した my_variables.mat を使うか、以下で作成)
    A = [1 2; 3 4];
    B = "test string";
    save my_variables.mat A B;
    
    % 構造体として読み込む
    data_struct = load('my_variables.mat');
    
    disp(data_struct);
    % 出力:
    % data_struct =
    %
    %   scalar structure containing the fields:
    %     A =
    %        1   2
    %        3   4
    %     B = test string
    
    % 構造体のフィールドとしてアクセス
    disp(data_struct.A);
    disp(data_struct.B);
    
  • 構文

    S = load('filename');
    
    • S: ファイル内の各変数がフィールドとして含まれる構造体。

スクリプトファイルの実行の代替方法

loadコマンドでスクリプトファイルを実行することは稀です。以下の方法が推奨されます。

a. ファイル名を直接入力する

  • my_script.m というファイルがある場合。
    my_script
    
  • 特徴
    スクリプトファイルがOctaveの検索パス上にあるか、現在の作業ディレクトリにある場合、ファイル名をコマンドラインに入力するだけで実行できます。
  • 用途
    最も一般的なOctaveスクリプトの実行方法です。
b. source コマンドを使用する

  • source('my_script.m');
    source('/path/to/another_script.m');
    
  • 構文
    source('filename.m');
    
  • 用途
    スクリプトファイルを明示的に実行する場合。特に、ファイル名が変数名と衝突する可能性がある場合や、ファイルパスを指定して実行する場合に便利です。
  • Excelファイル
    Octaveには直接のExcelファイル読み込み機能は組み込まれていませんが、サードパーティのパッケージ(例: ioパッケージのxlsread)を使用するか、ExcelファイルをCSV形式でエクスポートしてからcsvreadなどで読み込むのが一般的です。
  • 音声ファイル
    audioread(WAVなど)
  • 画像ファイル
    imread(JPEG, PNG, BMPなど)