Octaveによる数値計算とデータ処理の基礎

概要

Octaveのデータ型は行列のみであり、行ベクトル(1行m列)、列ベクトル(n行1列)、スカラー(1行1列)はすべて行列として扱われる。基本的な演算には、四則演算(+、-、.*、./)、数学関数(sqrt、abs、exp、log等)、論理演算(&、|、~)、比較演算(<、<=、>、>=、==、~=)がある。行列操作では、転置(.')、複素共役転置(')、行列積(*)、逆行列(inv)、固有値・固有ベクトル(eig)等が利用できる。行列の要素へのアクセスは行番号と列番号をカンマで区切って指定する。プログラム制御にはfor文、while文、if文が使用でき、ファイル入出力ではCSV、テキスト、Excel、バイナリ形式等に対応している。外部パッケージや、Python、C/C++との連携も可能である。エラー処理にはtry-catch構文が利用でき、デバッグにはブレークポイントの設定や変数状態の確認等の機能が提供されている。

目次

1. 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]) を実行し、グラフ描画を確認する。

2. Octaveのデータ型

Octaveのデータ型は行列のみである。本ページでは、行ベクトル、列ベクトル、スカラーという用語を次の意味で使用する。

Octaveでは、変数名の大文字と小文字を区別する。本ページでは、行ベクトル、列ベクトル、スカラーを表す変数名には小文字を、一般の行列を表す変数名には大文字を使用している。

3. 行ベクトル

行ベクトルのコンストラクタ

【要点】

行ベクトルは、1行m列の行列 (m>=1)である。

変数 t に、要素 2、1、3 の行ベクトル(要素がこの順で並ぶ)を格納する場合は次のように記述する。

t = [2 1 3]

要素の操作

行ベクトルの演算

4. 列ベクトル

【要点】

変数 t に、要素 2、1、3 の列ベクトル(要素がこの順で並ぶ)を格納する場合は次のように記述する。

t = [2; 1; 3]

5. 行列

行列のコンストラクタ

【要点】

変数 M に2行2列の行列を格納する場合、次のような記法を使用する。

M = [1 3; 2 4]

この行列は次のように配置される。

1 3
2 4

行列の要素の操作

行列の演算

6. スカラーに対する演算

Octaveでは、スカラーに対する演算を行列やベクトル(行ベクトルと列ベクトル)に適用できる。この場合、行列やベクトルの各要素に対して個別に演算が実行される。また、同じサイズの行列やベクトル同士であれば2項演算を適用できる。

四則演算

数学関数

論理演算

論理演算では、0を偽(FALSE)、0以外の値を真(TRUE)として扱う。比較演算の結果は、真の場合は1、偽の場合は0となる。

比較演算

行列やベクトルに対する比較演算は、各要素に対して個別に実行される。比較結果は、真の場合は1、偽の場合は0となる。

集約演算

集約演算の使用例を以下に示す。

x = [1 2 3 4 5 6];
max(x)
min(x)
mean(x)
sum(x)
length(x)

グラフ描画関数

7. その他の関数

最適化関数

信号処理関数

フィルタリング関数

補間関数

8. 制御構造

9. 外部ライブラリとの連携

Octaveでは、外部パッケージやPythonとの連携により、機能を拡張できる。本節ではWindows環境での手順を説明する。

Forgeパッケージの利用

Octave Forgeは、Octaveの機能を拡張するパッケージ群である。pkg関数を使用してパッケージを管理する。

pkg list                      % インストール済みパッケージの一覧表示
pkg install -forge control    % 制御系設計用パッケージのインストール
pkg load control              % パッケージのロード
pkg unload control            % パッケージのアンロード
pkg uninstall control         % パッケージのアンインストール

主要なパッケージのインストール例を以下に示す。

pkg install -forge signal     % 信号処理パッケージ
pkg install -forge image      % 画像処理パッケージ
pkg install -forge statistics % 統計解析パッケージ
pkg install -forge io         % 入出力機能拡張パッケージ
pkg install -forge optim      % 最適化パッケージ

Pythonとの連携

Windows環境でPython連携を行うには、pythonicパッケージ(Octaveから任意のPythonモジュールを呼び出すためのパッケージ)を導入する。以下の準備が必要である。

pythonicパッケージのインストールとロードを以下に示す。使用するPythonはパッケージのインストール時に決定される。特定のPythonを指定する場合は、インストール前に環境変数 PYTHON を設定する。

setenv("PYTHON", "C:/Program Files/Python312/python.exe");  % 使用するPythonを指定(環境に応じて変更)
pkg install "https://gitlab.com/mtmiller/octave-pythonic/-/archive/v0.0.1/octave-pythonic-v0.0.1.tar.gz"
pkg load pythonic             % パッケージのロード
pyversion                     % 使用中のPython情報の確認

パッケージをロードすると、任意のPythonのクラスや関数を py. という接頭辞で呼び出せる。NumPyの関数を呼び出す例を以下に示す。

x = py.numpy.sqrt(1:10);      % NumPyの関数を呼び出す

Pythonモジュールの検索パスに、自作モジュールのあるディレクトリを追加する例を以下に示す。

py.sys.path.insert(int32(0), "C:/path/to/module");

C/C++との連携

Octaveでは、C++で書いたコードをoct-file(拡張子 .oct の動的読み込みモジュール)にコンパイルして関数として呼び出す。Windows環境では、Octaveに同梱されるMinGW-w64コンパイラが使用される。次のC++コードを helloworld.cc として用意する。ファイル名は DEFUN_DLD で指定する関数名と一致させる。

#include <octave/oct.h>

DEFUN_DLD (helloworld, args, nargout,
           "Hello World Help String")
{
  octave_stdout << "Hello World has "
                << args.length () << " input arguments and "
                << nargout << " output arguments.\n";

  octave_value_list retval (nargout);
  for (int i = 0; i < nargout; i++)
    retval(i) = octave_value (Matrix ());

  return retval;
}

mkoctfileコマンドでコンパイルし、生成された関数を呼び出す。

mkoctfile helloworld.cc       % helloworld.oct を生成
helloworld(1, 2, 3)           % 生成した関数の呼び出し

Windowsシステムコマンドとの連携

system関数を使用してWindowsコマンドを実行できる。

[status, output] = system('dir');      % Windowsコマンドの実行
status = system('explorer .');         % エクスプローラーを開く

環境変数の操作例を以下に示す。

getenv('PATH');                        % 環境変数の取得
setenv('CUSTOM_VAR', 'value');         % 環境変数の設定

連携時の注意点

外部ライブラリとの連携時は、以下の点に注意する。

パス設定の確認: 外部ライブラリやPythonとの連携時は、システムのPATH設定が正しく行われていることを確認する。不適切なPATH設定は、予期しないエラーの原因となる。

Pythonのバージョン整合: pythonicパッケージが用いるPythonと、連携に使うPythonパッケージ(NumPy等)が同一のPython環境に属していることを確認する。

10. ファイルの入出力

Octaveでは、様々な形式のファイルの読み書きが可能である。数値データの入出力機能を提供している。

CSVファイルの操作

csvread関数を使用してCSVファイルを読み込む。

data = csvread('input.csv');           % 基本的な読み込み
data = csvread('input.csv', 1, 0);     % 2行目から読み込み(ヘッダーをスキップ)
data = csvread('input.csv', 0, 0, [0 0 2 3]); % 特定範囲の読み込み

csvwrite関数を使用してCSVファイルを書き込む。

A = [1 2 3; 4 5 6; 7 8 9];
csvwrite('output.csv', A);             % 基本的な書き込み
csvwrite('output.csv', A, 1, 0);       % 2行目から書き込み

csvread・csvwriteは区切り文字がカンマに固定される。区切り文字を指定する場合は、dlmread関数とdlmwrite関数を使用する。

data = dlmread('input.txt', '\t');     % タブ区切りファイルの読み込み
dlmwrite('output.txt', A, '\t');       % タブ区切りファイルの書き込み

テキストファイルの操作

textscan関数を使用して、書式を指定してテキストファイルを読み込む。読み込み結果はセル配列として得られる。

fid = fopen('data.txt', 'r');                      % ファイルを開く
C = textscan(fid, '%s %d');                        % 文字列と数値の読み込み
fclose(fid);                                       % ファイルを閉じる
names = C{1};
ages = C{2};

1行ずつ読み込む低レベルのファイル操作を行う例を以下に示す。

fid = fopen('input.txt', 'r');                     % ファイルを開く
line = fgetl(fid);                                 % 1行読み込み
fclose(fid);                                       % ファイルを閉じる

fprintf関数を使用してテキストファイルを書き込む。

fid = fopen('output.txt', 'w');                    % 書き込みモードでファイルを開く
fprintf(fid, 'x = %f, y = %f\n', x, y);            % フォーマット指定して書き込み
fclose(fid);                                       % ファイルを閉じる

Excelファイルの操作

Excelファイルの操作には、ioパッケージの導入が必要である。インストールは以下のコマンドで実行する。

pkg install -forge io
pkg load io

xlsread関数を使用してExcelファイルを読み込む。

[num, txt, raw] = xlsread('data.xlsx');            % 数値、テキスト、全データの読み込み
data = xlsread('data.xlsx', 'Sheet1');             % 特定シートの読み込み
data = xlsread('data.xlsx', 'Sheet1', 'A1:D10');   % 特定範囲の読み込み

xlswrite関数を使用してExcelファイルを書き込む。

xlswrite('output.xlsx', A);                        % 基本的な書き込み
xlswrite('output.xlsx', A, 'Sheet1');              % 特定シートへの書き込み
xlswrite('output.xlsx', A, 'Sheet1', 'B2');        % 特定位置への書き込み

バイナリファイルの操作

fread関数とfwrite関数を使用してバイナリファイルを操作する。

fid = fopen('data.bin', 'rb');                     % バイナリ読み込みモード
data = fread(fid, [100 1], 'double');              % 倍精度実数として読み込み
fclose(fid);

fid = fopen('output.bin', 'wb');                   % バイナリ書き込みモード
fwrite(fid, A, 'double');                          % 倍精度実数として書き込み
fclose(fid);

save関数とload関数を使用してMAT形式ファイルを操作する。

save('workspace.mat');                             % 全変数を保存
save('data.mat', 'x', 'y');                        % 特定変数のみ保存
load('workspace.mat');                             % データの読み込み

ファイル操作の補助関数

ファイルとディレクトリの操作例を以下に示す。

dir('*.csv');                                      % ファイル一覧の取得
exist('file.txt', 'file');                         % ファイルの存在確認
mkdir('newdir');                                   % ディレクトリの作成
cd('path/to/directory');                           % ディレクトリの移動

ファイルパスの操作例を以下に示す。

[pathstr, name, ext] = fileparts('path/to/file.txt');  % パスの分解
fullfile('path', 'to', 'file.txt');                    % パスの結合

11. エラー処理とデバッグ手法

基本的なエラー処理

Octaveにおけるエラー処理は、try-catch構文を用いて実現できる。また、警告(warning)の制御も可能である。

try-catch構文によるエラー処理の例を以下に示す。

try
    x = 1/0;
catch err
    disp(['エラーメッセージ: ' err.message]);
    disp(['エラー識別子: ' err.identifier]);
end

error関数を使用してエラーを意図的に発生させる。

function result = divide(a, b)
    if b == 0
        error('DIVIDE:ZeroDivisor', '0による除算は許可されていない。');
    end
    result = a/b;
end

warning関数を使用して警告を制御する。

warning('off', 'all');           % 全ての警告を無効化
warning('on', 'all');            % 全ての警告を有効化
warning('query', 'all');         % 警告の状態を確認

デバッグに有用な関数

デバッガの起動と制御を行う例を以下に示す。

dbstop in function_name        % 関数内にブレークポイントを設定
dbstop if error                % エラー発生時に停止
dbstep                         % 1行実行
dbcont                         % 実行継続
dbquit                         % デバッグモード終了

変数の状態を確認する関数を以下に示す。

whos                           % メモリ内の全変数の情報を表示
who                            % メモリ内の変数名一覧を表示
isnumeric(x)                   % 数値型かどうかを確認
ischar(x)                      % 文字型かどうかを確認
isempty(x)                     % 空かどうかを確認

tic関数とtoc関数を使用して実行時間を計測する。

tic;                           % 時間計測開始
A = rand(1000);                % 計測対象の処理
B = A * A;
elapsed_time = toc;            % 計測終了、経過時間を取得

profile関数を使用してプロファイリングを行う。

profile on                     % プロファイリング開始
% 計測対象の処理を実行
profile off                    % プロファイリング終了
profshow                       % 結果レポートを表示

デバッグ時の表示制御

disp関数とprintf関数を使用してデバッグ用メッセージを出力する。

disp('デバッグメッセージ');
printf('変数xの値: %f\n', x);

pause関数を使用して実行を一時停止する。

pause;                         % キー入力まで待機
pause(2);                      % 2秒間待機

エラー発生時の推奨対応

エラーメッセージの解析: エラーメッセージには、エラーの種類、発生場所、原因が含まれている。これらを注意深く読み解く。

スタックトレースの確認: エラー発生時のスタックトレースを確認することで、エラーが発生するまでの関数呼び出しの流れを把握できる。

変数の型とサイズの確認: 行列演算におけるエラーの多くは、変数の型やサイズの不一致によって発生する。whos関数を使用して確認する。

段階的なデバッグ: 複雑な処理を分割し、各段階での中間結果を確認することで、エラーの原因を特定しやすくなる。