Octaveプログラミング初心者必見!「load」コマンド活用術と実践例
Octaveのload
コマンドは、主に以下の2つの目的で使用されます。
- 保存された変数(データ)の読み込み:
save
コマンドでファイルに保存されたOctaveの変数(行列、ベクトル、スカラなど)を、現在のワークスペースに読み込むために使用されます。 - 実行可能なスクリプトファイルの読み込みと実行: Octaveのスクリプトファイル(
.m
ファイル)を読み込み、その中のコマンドを実行するために使用されます。ただし、スクリプトの実行には通常はファイル名を直接入力するかsource
コマンドを使うことが一般的です。
保存された変数(データ)の読み込み
これがload
コマンドの最も一般的な使用方法です。
基本的な使い方
load filename
filename
: 読み込みたいデータが保存されているファイルの名前を指定します。拡張子を省略すると、Octaveはまず.mat
、次に.oct
、そして他の形式のファイルを探します。
例
例えば、あなたが以前にmy_data.mat
というファイルに変数A
とB
を保存したとします。
% 以前に保存したと仮定
A = [1 2; 3 4];
B = "hello";
save my_data.mat A B
このmy_data.mat
を読み込むには、次のようにします。
load my_data.mat
このコマンドを実行すると、my_data.mat
に保存されていた変数A
とB
が現在の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の場合)。
- ファイル名に誤字脱字がある。
- ファイルがパス上にない。
- 現在の作業ディレクトリ(カレントディレクトリ)にファイルがない。
- ファイルが存在しない。
- 指定されたファイル名が間違っている。
トラブルシューティング
- ファイル名の確認
- ファイル名が正確であることを再確認してください(拡張子も含む)。
- 例:
my_data.mat
と入力すべきところをmydata.mat
と入力していないか。
- カレントディレクトリの確認
pwd
コマンドで現在の作業ディレクトリを確認し、ファイルがそこにあるかを確認します。ls
またはdir
コマンドで、現在のディレクトリ内のファイルリストを確認し、目的のファイルが存在するかを確認します。
- パスの確認
- ファイルがカレントディレクトリにない場合、そのファイルが存在するディレクトリへの完全なパスを指定する必要があります。
- 例:
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
コマンドで現在の検索パスを確認できます。
- 大文字/小文字の区別
- ファイルシステムによっては、ファイル名の大文字/小文字が区別されます(例: Linux)。
MyData.mat
とmydata.mat
は異なるファイルとして扱われます。正確なファイル名を指定してください。
- ファイルシステムによっては、ファイル名の大文字/小文字が区別されます(例: Linux)。
ファイル形式の不一致 (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
)のファイルを読み込もうとします。
トラブルシューティング
- テキストファイルとしての読み込み
- プレーンテキストファイルから数値データを読み込む場合は、
-ascii
オプションを使用します。これにより、ファイル全体が1つの行列として読み込まれます。load -ascii my_text_data.txt
- または、
csvread
、dlmread
、textread
、textscan
といった関数を使用して、より柔軟にテキストデータを読み込むことができます。これらは、特定のデリミタ(区切り文字)やデータ型を指定するのに適しています。% 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で作成されたファイルであり、互換性がない。
- ファイルが外部要因(ディスクエラー、転送中の破損など)によって破損した。
- 保存時にエラーが発生し、ファイルが不完全になった。
トラブルシューティング
- ファイルの再保存
- 可能であれば、元の環境でファイルを再度
save
コマンドで保存し直してください。
- 可能であれば、元の環境でファイルを再度
- ファイルの健全性チェック
- ファイルサイズが極端に小さい場合や、他のプログラムで開こうとしてエラーになる場合は、ファイルが破損している可能性があります。
- バージョン互換性の確認
- 異なるバージョンの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
- MATLAB互換のバージョン7形式で保存:
- 異なるバージョンのOctaveやMATLAB間でファイルをやり取りする場合、
変数の読み込み失敗 (Variable not found after loading / Undefined variable)
原因
- テキストファイルを
load
した場合、そのファイル名が変数名として自動的に使用されるが、そのファイル名と異なる名前で変数にアクセスしようとしている。 load filename variable_name
のように特定の変数を指定して読み込んだが、その変数がファイル内に存在しない。
トラブルシューティング
- ファイル内の変数を確認
load filename
のように引数なしでファイルを読み込み、whos
コマンドでワークスペース内の変数をリスト表示し、意図した変数が読み込まれているか確認します。- もしファイルに複数の変数が保存されている場合、すべての変数がワークスペースに読み込まれます。
- テキストファイルの読み込みと変数への代入
- テキストファイルを読み込む場合、通常はファイル名がそのまま変数名になります。
load mydata.txt % この場合、`mydata`という名前の行列が作成される
- もし別の変数名で受け取りたい場合は、明示的に代入します。
my_variable = load('mydata.txt');
- テキストファイルを読み込む場合、通常はファイル名がそのまま変数名になります。
スクリプトファイルの実行に関する問題 (Issues with executing script files)
原因
- スクリプト内でエラーが発生している場合、
load
コマンドの問題ではなく、スクリプト自体の問題です。 load
コマンドはスクリプトファイル(.m
ファイル)も実行できますが、通常はファイル名を直接入力するか、source
コマンドを使用する方が推奨されます。
- スクリプトを直接実行
- ファイル名を入力してスクリプトを実行し、エラーメッセージを直接確認します。
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、特定の区切り文字、ヘッダー行など)を扱う場合は、
csvread
、dlmread
、textscan
といった関数を使用する方が柔軟で強力です。 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
で開いたファイルIDC
: セル配列として結果が返されます。
-
textread (古い形式、シンプルだが機能限定的)
[col1, col2, col3] = textread('filename', 'format', N, 'param', value, ...);
-
特徴
- フォーマット文字列を使用して、読み込むデータの型(例:
%f
浮動小数点、%s
文字列、%d
整数)を指定できます。 - 複数の変数に異なるデータ型を読み込めます。
- 区切り文字、コメント文字、繰り返し回数などを細かく制御できます。
- フォーマット文字列を使用して、読み込むデータの型(例:
-
用途
複雑な形式のテキストファイル(数値と文字列が混在、特定のパターンを持つデータ、異なる区切り文字)を読み込むのに非常に強力です。
バイナリ形式のデータ(.mat, .octなど)の読み込みの代替方法
load
コマンドがこれらの形式の標準的な読み込み方法ですが、特定の場合には以下の関数が役立つことがあります。
a. load
関数の戻り値を利用する
load
関数を直接呼び出すと、ファイル内の変数が現在のワークスペースに展開されます。しかし、load
関数を関数の戻り値として使用すると、ファイル内のすべての変数を**構造体(structure)**として読み込むことができます。これは、読み込む変数の名前が不明な場合や、ワークスペースを汚染したくない場合に便利です。
-
例
my_variables.mat
にA
とB
が保存されていると仮定。% データ保存 (例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など)