Octave filereadの代替手段:効率的なファイル読み込みテクニック

2025-06-06

filereadの基本的な使い方

fileread関数の基本的な構文は以下の通りです。

str = fileread('filename')

ここで、

  • 'filename' は、読み込むファイルのパスと名前を指定する文字列です。ファイルが現在のディレクトリにない場合は、絶対パスまたは相対パスを指定する必要があります。
  • str は、読み込まれたファイルの内容が格納される文字列変数です。

具体的な例

  1. 簡単なテキストファイルの読み込み

    例えば、my_text_file.txtという名前のファイルがあり、その中に以下の内容が書かれているとします。

    Hello, Octave!
    This is a test file.
    

    このファイルをOctaveで読み込むには、次のようにします。

    file_content = fileread('my_text_file.txt');
    disp(file_content);
    

    これにより、以下のような出力が得られます。

    Hello, Octave!
    This is a test file.
    
  2. スクリプトファイルの読み込み

    my_script.mという名前のOctaveスクリプトファイルがあり、その中に以下のようなコードが書かれているとします。

    function y = my_func(x)
        y = x * 2;
    endfunction
    

    このスクリプトの内容を読み込むには、次のようにします。

    script_content = fileread('my_script.m');
    disp(script_content);
    

    出力は以下のようになります。

    function y = my_func(x)
        y = x * 2;
    endfunction
    

注意点

  • 改行コード
    filereadは、ファイル内の改行コード(Windowsの\r\n、Unix/Linuxの\nなど)をそのまま文字列として読み込みます。
  • メモリ使用量
    filereadはファイル全体を一度にメモリに読み込むため、非常に大きなファイルを読み込む際には、メモリが不足する可能性があります。そのような場合は、fopenfgetlなどの関数を使用して、ファイルを少しずつ読み込む方が効率的です。
  • ファイルの存在
    指定されたファイルが見つからない場合、fileread関数はエラーを発生させます。ファイルを読み込む前に、exist関数などを使ってファイルの存在を確認することが推奨されます。
  • 簡単なログファイルの表示
    全体のログファイルの内容を一気に確認する場合。
  • ファイルの比較
    2つのテキストファイルの内容を比較する場合。
  • コードの動的な評価
    テキストファイルに格納されたOctaveコードを読み込み、eval関数で動的に実行する場合(ただし、セキュリティ上のリスクに注意が必要)。
  • 設定ファイルの読み込み
    簡単なテキスト形式の設定ファイルを読み込み、その内容をパース(解析)する場合。


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

これは最も一般的なエラーです。Octaveが指定されたファイルを見つけられない場合に発生します。

エラーメッセージの例

error: fileread: file not found: 'non_existent_file.txt'

原因とトラブルシューティング

  • ファイルの存在確認
    実行前にexist('filename', 'file')を使ってファイルの存在を確認することができます。
    if exist('my_file.txt', 'file')
        file_content = fileread('my_file.txt');
        disp('ファイルを読み込みました。');
    else
        disp('エラー: 指定されたファイルが見つかりません。');
    end
    
  • カレントワーキングディレクトリの確認
    pwdコマンドで現在の作業ディレクトリを確認し、ファイルがそこにあるか、または指定したパスが正しいか確認してください。必要であれば、cdコマンドで作業ディレクトリを変更します。
  • パスの指定ミス
    • 現在のディレクトリ
      fileread('my_file.txt')のようにファイル名だけを指定する場合、Octaveはカレントワーキングディレクトリ(現在の作業ディレクトリ)からそのファイルを探します。
    • 絶対パス
      ファイルが別の場所にある場合は、フルパス(例: fileread('/home/user/documents/my_file.txt') または fileread('C:\\Users\\User\\Documents\\my_file.txt'))を指定する必要があります。Windowsの場合、バックスラッシュ\はエスケープする必要があるため、\\と二重にするか、スラッシュ/を使用できます。
    • 相対パス
      Octaveスクリプトからの相対パスでファイルを探す場合は、../data/my_file.txtのように指定できます。
  • ファイル名の誤字脱字
    ファイル名が正しく入力されているか確認してください。大文字と小文字も区別されます。

アクセス権の問題 (Permission denied)

Octaveがファイルを読み取るための適切な権限を持っていない場合に発生します。

エラーメッセージの例

error: fileread: permission denied: 'restricted_file.txt'

原因とトラブルシューティング

  • ファイルが他のプログラムで使用中
    別のプログラム(テキストエディタなど)がそのファイルを排他的に開いている場合、Octaveが読み取れないことがあります。他のプログラムでファイルが閉じられているか確認してください。
  • 読み取り権限
    ファイルまたはそのファイルを含むディレクトリに、Octaveを実行しているユーザーが読み取り権限を持っているか確認してください。
    • Unix/Linuxの場合: ls -l restricted_file.txt でパーミッションを確認し、必要に応じて chmod コマンドで権限を変更します。
    • Windowsの場合: ファイルのプロパティからセキュリティタブを確認し、読み取り権限があることを確認します。

メモリ不足 (Out of memory)

非常に大きなファイルをfilereadで読み込もうとすると、システムメモリが不足し、エラーが発生することがあります。

エラーメッセージの例

error: out of memory -- fileread(filename)

または、単にOctaveがフリーズしたり、非常に遅くなったりする場合があります。

原因とトラブルシューティング

  • 解決策
    • ファイルを分割して読み込む
      大きなファイルを読み込む場合は、filereadではなく、fopenfgetl(行ごとに読み込み)、fread(バイナリデータを読み込み)などの関数を使って、ファイルをチャンク(塊)に分けて読み込むようにしてください。これにより、メモリの使用量を抑えられます。
    • システムメモリの増設
      根本的な解決策ではありませんが、物理メモリを増やすことで一時的に問題を回避できる場合があります。
    • 不要な変数のクリア
      Octaveセッション中に大量のメモリを消費している変数があれば、clearコマンドで解放してください。
  • ファイルの大きさ
    filereadはファイル全体を一度にメモリに読み込みます。数GBといった非常に大きなファイルの場合、メモリを使い果たしてしまう可能性があります。

不適切なファイル内容(バイナリファイルなど)

filereadはファイルの内容を文字列として扱います。したがって、バイナリファイル(画像ファイル、実行ファイルなど)を読み込むと、人間には読めない文字の羅列となり、文字コードの問題を引き起こす可能性があります。

原因とトラブルシューティング

  • バイナリファイルの読み込み
    バイナリファイルを扱う場合は、fread関数を使用し、適切なデータ型を指定して読み込む必要があります。
  • 目的の確認
    そもそもそのファイルを文字列として読み込む必要があるのかを確認してください。

文字エンコーディングの問題

  • デフォルトエンコーディング
    Octaveのデフォルトの文字エンコーディングが、読み込むファイルのエンコーディングと異なる場合があります。
  • インターネット検索
    エラーメッセージをそのままコピーしてインターネットで検索すると、同じ問題に直面した他のユーザーの解決策が見つかることがあります。
  • Octaveのバージョン
    使用しているOctaveのバージョンが古い場合、既知のバグがあるかもしれません。最新版にアップデートすることで問題が解決することもあります。
  • 絶対パスを使用する
    とりあえず問題を切り分けるために、ファイルへの絶対パスを使ってfilereadを試してみてください。
  • 簡単なケースから試す
    問題が発生しているファイルと同じディレクトリに、内容が一行だけの簡単なテキストファイルを作成し、それをfilereadで読み込めるか試してみてください。これにより、パスの問題なのか、ファイル内容の問題なのかを切り分けることができます。
  • エラーメッセージを読む
    Octaveのエラーメッセージは、問題の原因を特定するための重要な情報源です。注意深く読んで、どの関数で、どのような問題が発生しているかを確認してください。


例1: 基本的なテキストファイルの読み込みと表示

最も基本的な使用例です。テキストファイルの内容を読み込み、Octaveのコマンドウィンドウに表示します。

ファイル: hello.txt

Hello, Octave!
This is a test file for fileread.
Enjoy programming!

Octaveコード

% 1. 読み込むファイル名を指定します。
%    このスクリプトと同じディレクトリにあると仮定します。
filename = 'hello.txt';

% 2. ファイルが存在するかどうかを確認します。
%    存在しない場合はエラーを防ぎます。
if exist(filename, 'file')
    % 3. fileread関数を使ってファイルの内容を文字列として読み込みます。
    file_content = fileread(filename);

    % 4. 読み込んだ内容を表示します。
    disp('--- ファイルの内容 ---');
    disp(file_content);
    disp('--------------------');
else
    % 5. ファイルが見つからない場合のメッセージ
    fprintf('エラー: ファイル "%s" が見つかりません。\n', filename);
    fprintf('現在のディレクトリ: %s\n', pwd);
end

出力例

--- ファイルの内容 ---
Hello, Octave!
This is a test file for fileread.
Enjoy programming!

--------------------

解説
fileread(filename)hello.txtの内容をfile_contentという変数に格納し、dispでその内容を表示しています。exist(filename, 'file')は、読み込みを試みる前にファイルが存在するかどうかを確認する良い習慣です。pwdは現在の作業ディレクトリを表示します。

例2: 設定ファイルの読み込みと簡単な解析

シンプルな設定ファイルから特定の情報を抽出する例です。ここでは、キー = 値の形式で書かれた設定ファイルを想定します。

ファイル: config.txt

app_name = MyApp
version = 1.0.0
author = Octave User
debug_mode = true
data_path = /var/lib/myapp/data/

Octaveコード

% 1. 設定ファイル名を指定
config_filename = 'config.txt';

% 2. ファイルの存在確認
if exist(config_filename, 'file')
    % 3. ファイル内容を読み込み
    config_content = fileread(config_filename);

    % 4. 読み込んだ内容を行ごとに分割します
    %    strsplitは文字列を区切り文字で分割します。
    %    ここでは改行文字('\n')で分割します。
    config_lines = strsplit(config_content, '\n');

    % 5. 設定を格納する構造体を初期化
    config_settings = struct();

    % 6. 各行を処理します
    for i = 1:length(config_lines)
        line = strtrim(config_lines{i}); % 前後の空白を削除

        % 空行またはコメント行(#で始まる)をスキップ
        if isempty(line) || startsWith(line, '#')
            continue;
        end

        % '=' でキーと値に分割
        parts = strsplit(line, '=', 2); % 2は最大分割数(最初の'='で分割)

        if length(parts) == 2
            key = strtrim(parts{1}); % キーの前後の空白を削除
            value = strtrim(parts{2}); % 値の前後の空白を削除

            % 必要に応じて値の型変換
            % 例: 'true'/'false'を論理値に変換
            if strcmp(value, 'true')
                value = true;
            elseif strcmp(value, 'false')
                value = false;
            elseif ~isnan(str2double(value)) % 数値に変換可能なら変換
                value = str2double(value);
            end

            % 設定を構造体に追加
            config_settings.(key) = value;
        end
    end

    % 7. 解析結果を表示
    disp('--- 設定内容 ---');
    disp(config_settings);
    fprintf('アプリケーション名: %s\n', config_settings.app_name);
    fprintf('デバッグモード: %s\n', mat2str(config_settings.debug_mode));
    disp('----------------');

else
    fprintf('エラー: 設定ファイル "%s" が見つかりません。\n', config_filename);
end

出力例

--- 設定内容 ---
app_name: MyApp
version: 1
author: Octave User
debug_mode: 1
data_path: /var/lib/myapp/data/

アプリケーション名: MyApp
デバッグモード: 1
----------------

解説
filereadで設定ファイル全体を読み込んだ後、strsplitで改行ごとに分割し、各行を処理しています。strtrimで不要な空白を削除し、strsplit=を区切りとしてキーと値を抽出し、最終的に構造体config_settingsに格納しています。値の型変換(文字列から論理値や数値へ)も行っています。

例3: Octaveスクリプトファイルの読み込みと簡単なコード解析

自身のOctaveスクリプトファイルを読み込み、例えば関数定義の行数を数えるといった簡単なコード解析を行う例です。

ファイル: my_functions.m

% これはテスト用のOctave関数ファイルです。

function result = add_numbers(a, b)
    % 2つの数値を加算します。
    result = a + b;
endfunction

function msg = greet(name)
    % 名前を受け取り、挨拶メッセージを返します。
    msg = ['Hello, ', name, '!'];
endfunction

% スクリプトの終わり

Octaveコード

% 1. 読み込むOctaveスクリプトファイル名を指定
script_filename = 'my_functions.m';

% 2. ファイルの存在確認
if exist(script_filename, 'file')
    % 3. スクリプト内容を読み込み
    script_content = fileread(script_filename);

    % 4. 行ごとに分割
    script_lines = strsplit(script_content, '\n');

    % 5. 関数定義の行数をカウント
    function_count = 0;
    for i = 1:length(script_lines)
        line = strtrim(script_lines{i}); % 前後の空白を削除
        % 'function'で始まる行を探す
        if startsWith(line, 'function ')
            function_count = function_count + 1;
            fprintf('  - 関数発見: %s\n', line);
        end
    end

    % 6. 結果を表示
    fprintf('ファイル "%s" は %d 行で構成されています。\n', script_filename, length(script_lines));
    fprintf('このファイルには %d 個の関数が定義されています。\n', function_count);

else
    fprintf('エラー: スクリプトファイル "%s" が見つかりません。\n', script_filename);
end

出力例

  - 関数発見: function result = add_numbers(a, b)
  - 関数発見: function msg = greet(name)
ファイル "my_functions.m" は 12 行で構成されています。
このファイルには 2 個の関数が定義されています。

解説
filereadでスクリプトファイルの内容を読み込み、それをstrsplitで改行ごとに分割しています。その後、ループで各行をチェックし、startsWith関数を使って"function "で始まる行を探すことで、関数定義の数をカウントしています。

filereadはファイル全体をメモリに読み込むため、非常に大きなファイル(数GBなど)には適していません。このような場合、行ごとに読み込むfgetlなどの関数が使われます。これはfilereadの直接的な例ではありませんが、filereadの限界と代替案を示す重要な例です。

Octaveコード

% 1. 大きなファイルを想定(ここではダミーファイルを作成)
big_filename = 'large_log.txt';
% ダミーファイルを作成(例: 100000行のデータ)
fprintf('大きなダミーファイル "%s" を作成中...\n', big_filename);
fid_write = fopen(big_filename, 'w');
for i = 1:100000
    fprintf(fid_write, 'Log entry %d: This is a log line.\n', i);
end
fclose(fid_write);
fprintf('ダミーファイルの作成が完了しました。\n');

% 2. filereadで読み込もうとすると... (コメントアウトして危険性を示す)
% disp('filereadで大きなファイルを読み込もうとします(注意!メモリを大量消費します)');
% try
%     large_content = fileread(big_filename);
%     disp('filereadで読み込み成功しました。');
%     fprintf('読み込んだ文字列の長さ: %d\n', length(large_content));
% catch ME
%     fprintf('filereadでエラーが発生しました: %s\n', ME.message);
%     disp('(メモリ不足の可能性があります)');
% end

% 3. 代わりに fgetl を使って行ごとに読み込みます。
disp('fgetlを使って行ごとにファイルを読み込みます(メモリ効率が良い)');
line_count = 0;
fid_read = fopen(big_filename, 'r'); % 読み込みモードでファイルを開く

if fid_read == -1
    fprintf('エラー: ファイル "%s" を開けません。\n', big_filename);
else
    while (!feof(fid_read)) % ファイルの終わりまでループ
        line = fgetl(fid_read); % 1行読み込む
        if ischar(line) % fgetlはEOFで数値(-1)を返すことがあるためチェック
            line_count = line_count + 1;
            % disp(line); % 各行を表示すると出力が膨大になるのでコメントアウト
        end
    end
    fclose(fid_read); % ファイルを閉じる
    fprintf('ファイル "%s" から %d 行を読み込みました。\n', big_filename, line_count);
end

% 4. ダミーファイルを削除
delete(big_filename);

出力例

大きなダミーファイル "large_log.txt" を作成中...
ダミーファイルの作成が完了しました。
fgetlを使って行ごとにファイルを読み込みます(メモリ効率が良い)
ファイル "large_log.txt" から 100000 行を読み込みました。

解説
この例では、まず大きなダミーファイルを作成しています。filereadを使った読み込み部分はコメントアウトされていますが、もし実行するとメモリを大量に消費し、大きなファイルではエラーになる可能性があります。代わりに、fopenでファイルを開き、fgetlで1行ずつ読み込む方法を示しています。feof(fid_read)はファイル終端に達したかどうかをチェックし、ischar(line)fgetlが返すEOFマーカー(通常は-1)を除外するために使われます。この方法は、メモリ使用量を抑えながら大きなファイルを処理する際に非常に有効です。



行ごとに読み込む (fgetl, fgets)

テキストファイルを処理する場合に最も一般的な代替方法です。ファイル全体をメモリにロードするのではなく、1行ずつ読み込むため、非常にメモリ効率が良いです。

主な関数

  • fgets(fid): ファイル識別子fidから次の1行を読み込みます。行末の改行文字が含まれます。ファイルの終端に達すると空の文字列("")を返します。
  • fgetl(fid): ファイル識別子fidから次の1行を読み込みます。行末の改行文字は含まれません。ファイルの終端に達すると-1を返します。

使用シナリオ

  • メモリが限られている環境でファイルを扱う場合。
  • ファイルの内容を解析し、特定のパターンに一致する行だけを抽出する場合。
  • 非常に大きなテキストファイル(ログファイル、データファイルなど)を行単位で処理する場合。

Octaveコード例

% 1. ダミーの大きなテキストファイルを作成
filename = 'large_log_data.txt';
fprintf('ダミーファイル "%s" を作成中...\n', filename);
fid_write = fopen(filename, 'w');
for i = 1:100000 % 10万行のデータ
    fprintf(fid_write, 'Log entry %05d: This is some sample data for line %d.\n', i, i);
end
fclose(fid_write);
fprintf('ダミーファイルの作成が完了しました。\n');

% 2. fgetl を使って行ごとに読み込み、行数をカウント
fprintf('\nfgetl を使って行ごとに読み込みます。\n');
line_count = 0;
total_char_count = 0;

fid_read = fopen(filename, 'r'); % 読み込みモードでファイルを開く

if fid_read == -1
    fprintf('エラー: ファイル "%s" を開けません。\n', filename);
else
    while (!feof(fid_read)) % ファイルの終わりまでループ
        line = fgetl(fid_read); % 1行読み込む (改行なし)

        if ischar(line) % fgetlはEOFで数値(-1)を返すことがあるためチェック
            line_count = line_count + 1;
            total_char_count = total_char_count + length(line);
            % 必要に応じて、ここで各行に対して処理を行う
            % 例: if startsWith(line, 'Error') ...
        end
    end
    fclose(fid_read); % ファイルを閉じる
    fprintf('ファイル "%s" から %d 行を読み込みました。\n', filename, line_count);
    fprintf('合計文字数 (改行除く): %d\n', total_char_count);
end

% 3. ファイルを削除
delete(filename);

解説
fopenでファイルを開き、その戻り値であるファイル識別子(fid_read)をfgetlに渡します。feof(fid_read)はファイルの終端に達したかどうかをチェックし、ループの終了条件として使われます。ischar(line)は、fgetlがファイル終端で数値の-1を返すため、有効な文字列であることを確認するためのものです。

区切り文字で区切られたデータを読み込む (textread, dlmread, csvread, load)

数値データが区切り文字(カンマ、タブ、スペースなど)で区切られて保存されている場合に非常に強力です。

主な関数

  • load 'filename': スペース区切りまたはタブ区切りの数値データを読み込みます。OctaveのMATLAB互換のバイナリファイル(.mat)を読み込む主要な関数でもあります。
  • csvread('filename'): カンマ区切り(CSV)の数値データを読み込み、行列として返します。dlmread('filename', ',')と同じです。
  • dlmread('filename', 'delimiter'): 区切り文字で区切られた数値データを読み込み、行列として返します。
  • textread('filename', 'format', N): 汎用的なテキスト読み込み関数。様々なフォーマットのデータを読み込めますが、Octaveではより特化した関数が推奨されることがあります。

使用シナリオ

  • 実験データ、センサーデータ、シミュレーション結果など、大量の数値データ。
  • 科学技術計算、データ分析でよく使われるCSVファイルやタブ区切りファイル。

Octaveコード例

% 1. ダミーのCSVファイルを作成
csv_filename = 'data.csv';
fprintf('ダミーCSVファイル "%s" を作成中...\n', csv_filename);
csv_data = [1, 2, 3; 4, 5, 6; 7, 8, 9];
dlmwrite(csv_filename, csv_data, ','); % dlmwriteはデータを区切り文字でファイルに書き込む
fprintf('ダミーCSVファイルの作成が完了しました。\n');

% 2. csvread を使ってCSVデータを読み込む
fprintf('\ncsvread を使ってCSVデータを読み込みます。\n');
try
    loaded_csv_data = csvread(csv_filename);
    disp('読み込んだCSVデータ:');
    disp(loaded_csv_data);
catch ME
    fprintf('エラー: csvread で問題が発生しました: %s\n', ME.message);
end

% 3. ダミーのスペース区切りファイルを作成
space_filename = 'space_data.txt';
fprintf('\nダミーのスペース区切りファイル "%s" を作成中...\n', space_filename);
fid_write = fopen(space_filename, 'w');
for i = 1:3
    fprintf(fid_write, '%d %d %d\n', i*10, i*10+1, i*10+2);
end
fclose(fid_write);
fprintf('ダミーファイルの作成が完了しました。\n');

% 4. load コマンドを使ってスペース区切りデータを読み込む
fprintf('\nload コマンドを使ってスペース区切りデータを読み込みます。\n');
try
    % loadは変数名としてファイル名を使うか、指定した変数にロードする
    % 変数名を指定しないと、ファイル名と同じ名前の変数にロードされる
    % (例: loaded_space_data という変数にロード)
    load(space_filename); % これは 'data.txt' という変数にロードされる
    % もしファイル名が変数として使えない場合や、特定の変数にロードしたい場合は
    % [var1, var2, ...] = textread(space_filename, '%f %f %f', 'whitespace', ' ')
    % のような形式も考慮される
    % しかし、ここではloadが最も簡単
    disp('読み込んだスペース区切りデータ (変数 "space_data"):');
    disp(space_data); % load はファイル名が変数名になる
catch ME
    fprintf('エラー: load コマンドで問題が発生しました: %s\n', ME.message);
end


% 5. ファイルを削除
delete(csv_filename);
delete(space_filename);

解説
csvreadはCSVファイルを直接行列に読み込みます。dlmwriteはデータをファイルに書き出す関数です。loadコマンドは、スペース区切りまたはタブ区切りのファイルを読み込む際に非常に便利で、ファイル名と同じ名前の変数(この例ではspace_data)にデータを格納します。

バイナリデータを読み込む (fread)

テキストファイルではない、画像ファイル、音声ファイル、カスタムフォーマットのデータファイルなどのバイナリデータを読み込む場合に必須です。

主な関数

  • fread(fid, count, precision): ファイル識別子fidからデータを読み込みます。countは読み込む要素数、precisionは読み込むデータの型(例: 'uint8', 'double', 'float32'など)を指定します。

使用シナリオ

  • カスタムデータフォーマット: 独自のバイナリ形式で保存されたデータを扱う場合。
  • 通信プロトコル: 特定のバイナリフォーマットで送られてくるデータを受信し解析する場合。
  • 画像処理: 生の画像データを読み込み、加工する場合。

Octaveコード例

% 1. ダミーのバイナリファイルを作成
binary_filename = 'binary_data.bin';
fprintf('ダミーバイナリファイル "%s" を作成中...\n', binary_filename);
% 0から255までのuint8データを書き込む
dummy_binary_data = uint8(0:255);
fid_write = fopen(binary_filename, 'wb'); % 'wb' はバイナリ書き込みモード
fwrite(fid_write, dummy_binary_data, 'uint8');
fclose(fid_write);
fprintf('ダミーバイナリファイルの作成が完了しました。\n');

% 2. fread を使ってバイナリデータを読み込む
fprintf('\nfread を使ってバイナリデータを読み込みます。\n');
fid_read = fopen(binary_filename, 'rb'); % 'rb' はバイナリ読み込みモード

if fid_read == -1
    fprintf('エラー: バイナリファイル "%s" を開けません。\n', binary_filename);
else
    % ファイル全体を uint8 型で読み込む
    % 第二引数 Inf はファイル全体を意味する
    loaded_binary_data = fread(fid_read, Inf, 'uint8');
    fclose(fid_read);

    disp('読み込んだバイナリデータの最初の10バイト:');
    disp(loaded_binary_data(1:10)'); % 転置して横に表示

    disp('読み込んだバイナリデータの最後の10バイト:');
    disp(loaded_binary_data(end-9:end)');

    fprintf('読み込んだバイナリデータの総要素数: %d\n', length(loaded_binary_data));
end

% 3. ファイルを削除
delete(binary_filename);

解説
fopenのモードを'rb'(読み込みバイナリ)または'wb'(書き込みバイナリ)とすることで、バイナリファイルを扱います。freadの第三引数でデータの型(precision)を指定することが重要です。Infを指定すると、ファイル全体を読み込みます。

Octaveには、特定のファイル形式(画像、音声、Octave/MATLABのバイナリワークスペース)を直接読み込むための高レベルな関数も用意されています。

主な関数

  • load('workspace_filename.mat'): OctaveまたはMATLABで保存されたバイナリワークスペースファイル(.matファイル)を読み込み、その中に保存されている変数を現在のワークスペースにロードします。
  • audioread('audio_filename'): 音声ファイル(WAVなど)を読み込み、音声データとサンプリングレートを返します。
  • imread('image_filename'): 画像ファイル(JPEG, PNG, BMPなど)を読み込み、行列として返します。

使用シナリオ

  • 以前のOctave/MATLABセッションで保存した複雑なデータ構造や変数群を再利用する場合。
  • 音声処理、音響分析。
  • 画像処理アプリケーション。

Octaveコード例 (.matファイルの読み込み)

% 1. ダミーの.matファイルを作成
mat_filename = 'my_data.mat';
fprintf('ダミーの.matファイル "%s" を作成中...\n', mat_filename);

% 保存する変数を作成
my_variable = rand(3, 3);
another_data = 'This is a string data.';
my_struct.field1 = 100;
my_struct.field2 = [10, 20, 30];

% 変数を.matファイルに保存
save(mat_filename, 'my_variable', 'another_data', 'my_struct');
fprintf('ダミーの.matファイルの作成が完了しました。\n');

% 2. load を使って.matファイルを読み込む
fprintf('\nload を使って.matファイルを読み込みます。\n');
% .matファイルの内容を現在のワークスペースにロードする
load(mat_filename);

disp('読み込んだ変数:');
who % 現在のワークスペースの変数を表示

disp('my_variable:');
disp(my_variable);

disp('another_data:');
disp(another_data);

disp('my_struct:');
disp(my_struct);

% 3. ファイルを削除
delete(mat_filename);

解説
saveコマンドで変数群を.matファイルに保存し、loadコマンドでそのファイルを読み込むことで、保存されていた変数が現在のOctaveワークスペースに復元されます。whoコマンドは現在のワークスペースにある変数を一覧表示します。