Octave でのテキストファイル入出力とユーザ I/O

【概要】 Octaveにおけるテキストファイル入出力とユーザI/O機能の使用方法を解説している.主な機能は,ユーザI/O機能,Cスタイルの入出力機能,ioパッケージの機能の3種類である.ユーザI/O機能では,disp関数による端末出力,input関数による入力受付,yes_or_no関数によるYes/No入力,menu関数によるメニュー選択が可能である.Cスタイルの入出力機能では,fopen関数によるファイルオープン,fclose関数によるクローズ,fprintf関数による書式付き書き込み,fgetl関数による行単位読み出し,sscanf関数による文字列スキャン,feof関数によるファイル終端検出が可能である.ioパッケージ機能では,dlmread関数とdlmwrite関数を使用してCSV形式ファイルの読み書きができる

Octave のインストール手順(Windows上)

【要点】

インストールには管理者権限が必要である.インストール中は他のアプリケーションを終了し,アンチウイルスソフトが干渉する場合は一時的に無効化することを推奨する.

  1. インストーラーの入手:公式サイト GNU Octave の"Windows Installers"セクションから,最新の安定版64bit版インストーラーをダウンロードする.
  2. 管理者権限での実行:ダウンロードしたインストーラーを右クリックし,「管理者として実行」を選択する.セキュリティ警告が表示された場合は「実行」を選択する.
  3. インストール言語:English(デフォルト)を選択し,「Next」をクリックする.現時点で日本語インターフェースには対応していない.
  4. ライセンス同意:条項を確認し,「I accept the agreement」を選択して「Next」をクリックする.
  5. インストール先の指定:デフォルトのパス(C:\Program Files\GNU Octave)を推奨する.重要:パスにスペースや日本語文字を含めないようにすること.
  6. コンポーネントの選択:以下の項目すべてを選択する.
    • Full installation(完全インストール)
    • Create Desktop Icon(デスクトップアイコンの作成)
    • Associate .m files with GNU Octave(.mファイルの関連付け)
  7. インストール実行:「Install」をクリックしてインストールを開始する.
  8. 初期動作確認:インストール完了後,以下の手順で動作を確認する:
    1. デスクトップ上のOctaveアイコンをダブルクリック
    2. コマンドウィンドウが開き,プロンプト(octave:)が表示されることを確認
    3. version コマンドを実行してバージョンを確認
    4. 2 + 2 を実行し動作を確認
    5. plot([1,2,3]) を実行し,グラフ描画を確認する.

Octave でのテキストファイル入出力とユーザ I/O

disp

端末への単純出力

(例) disp("message");

fdisp

ファイル(標準エラー出力)などへの出力

(例) fdisp(stderr, "message");

input

端末からの入力

(例) input("please input x = ");

yes_or_no

端末からの Yes/No 入力

(例) yes_or_no("Do you proceed ? ");

menu

端末へのメニュー表示と入力

(例) menu( "Fruits", "apple", "orange", "banana" );

kbhit

キーボードからの入力

(例) kbhit();

fopen

ファイルのオープン

(例) [fid, msg] = fopen( "C:\\hoge.txt", "rt" ); ・・・ ファイル「C:\hoge.txt」を,リード用にオープンする.

(例) [fid, msg] = fopen( "C:\\hoge.txt", "wt" ); ・・・ ファイル「C:\hoge.txt」を,ライト用にオープンする.

いずれも,エラー発生時には,msg にシステムエラーメッセージがセットされる.

(例)ファイルのオープンとエラーメッセージ

  [fid, msg] = fopen("C:\\hoge.dat", "r");
  if ( fid == -1 )
    disp( msg );
  fclose(fid);

fclose

ファイルのクローズ

(例) fclose( fid );

fprintf

書式付き書き込み

引数が行列(matrix)のとき,行列の全要素が出力される.%f 等のフォーマットテンプレート(フォーマットテンプレートは,「%4.2f %8.2f」のように複数書ける)は,行列に使われたとき,順番に使用され,行列の全ての値が表示される.そのため,行や列単位で整形されることはない(これはこれで便利である).行列の要素数(縦×横)がフォーマットテンプレートの個数の倍数になっていないと,表示が崩れる.

* 行列を整形して出力したいときは,dlmwrite が便利である.

(例)fprintf( fid, "%d", v ); ・・・ 整数を,10進形式で表示する(decimal).

(例)fprintf( fid, "%o", v ); ・・・ 整数を,8進形式で表示する(octal).

(例)fprintf( fid, "%x", v ); ・・・ 整数を,16進形式で表示する(hexadecimal).

(例)fprintf( fid, "%s", v ); ・・・ 文字列の引数 v を表示する(string).

(例)fprintf( fid, "%f", v ); ・・・ 浮動小数を固定小数点形式で表示する.

(例)fprintf( fid, "%4.2f %8.2f", v ); ・・・ 浮動小数を固定小数点形式(全体の桁数と小数部の桁数指定.例えば %4.2f なら,全体の桁数が4,小数部の桁数が2)で表示する.

(例)fprintf( fid, "%e", v ); ・・・ 浮動小数を指数形式で表示する(exponential notation).

(例)行列の書き込み.

【プログラム説明】4x4のランダム行列を生成し,ファイルに書き込む.各要素は5桁の小数点以下4桁の固定小数点形式で出力される.

  M = rand(4,4);
  [fid, msg] = fopen("C:\\hoge.dat", "w");
  fprintf(fid, ", %5.4f", M);
  fclose(df);

fgetl

行単位でのファイル読み出し.

(例)line = fgetl( fid );

この例では,改行文字(newline)あるいは EOF(End of File)に達するまで読み込む. 改行文字を取り除いて,line にセットする.

sscanf

文字列のスキャン

(例)[val, count] = sscanf(s, template, Inf); ・・・ 文字列 s から「可能な限り多く」読み込んで,列ベクトル(column vector)を返す.

(例)テキストファイルの先頭1行読み出し

  [fid, msg] = fopen("C:\\hoge.dat", "r");
  line = fgetl(fid);
  [val, count] = sscanf(line, ", %f", Inf);

feof

ファイルの終わり

(例)ファイルを行単位で読み込んで,端末に表示する.

* この例では,ファイルの終わりに達するまで,行単位でのファイル読み出しを行う.

【プログラム説明】ファイルを開き,EOF(End of File)に達するまで各行を読み込み,表示する.最後にファイルを閉じる.

[fid, msg] = fopen("C:\\hoge.txt", "r");
while( ! feof(fid) )
    line = fgetl(fid);
    disp(line);
endwhile
fclose(fid)

dlmread

行列やベクトルのファイルからの読み出し.数字が並んだデータなら,簡単に読み出すことができる.

(例)区切り文字は「,」.1行目から読む(0行目は読み飛ばす).0列目から読む(列の読み飛ばしは無い).

  pkg load io;
  A = dlmread( "C:\\hoge.txt", ",", 1, 0 )

dlmwrite

行列やベクトルのファイルへの書き込み

(例)行ベクトルの書き込み.区切りは「, 」で,行列の各行の末尾は「\n」である.

  pkg load io;
  v = randn(1,10)
  dlmwrite( "C:\\hoge.txt", v, "delimiter", ", ", "newline", "\n" )

(例)行列の書き込み.区切りは「, 」で,行列の各行の末尾は「\n」である.

  pkg load io;
  A = reshape(1:12, 3, 4)
  dlmwrite( "C:\\hoge.txt", A, "delimiter", ", ", "newline", "\n" )