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上)
【要点】
インストールには管理者権限が必要である。インストール中は他のアプリケーションを終了しておく。
- インストーラーの入手:公式サイト GNU Octave の"Windows Installers"セクションから、最新の安定版64bit版インストーラーをダウンロードする。
- 管理者権限での実行:ダウンロードしたインストーラーを右クリックし、「管理者として実行」を選択する。セキュリティ警告が表示された場合は「実行」を選択する。
- インストール言語:English(デフォルト)を選択し、「Next」をクリックする。
- ライセンス同意:条項を確認し、「I accept the agreement」を選択して「Next」をクリックする。
- インストール先の指定:デフォルトのパス(C:\Program Files\GNU Octave)を推奨する。パスにスペースや日本語文字を含めないこと。
- コンポーネントの選択:以下の項目すべてを選択する。
- Full installation(完全インストール)
- Create Desktop Icon(デスクトップアイコンの作成)
- Associate .m files with GNU Octave(.mファイルの関連付け)
- インストール実行:「Install」をクリックしてインストールを開始する。
- 初期動作確認:インストール完了後、以下の手順で動作を確認する。
- デスクトップ上のOctaveアイコンをダブルクリックする。
- コマンドウィンドウが開き、プロンプト(octave:)が表示されることを確認する。
- version コマンドを実行してバージョンを確認する。
- 2 + 2 を実行し動作を確認する。
- plot([1,2,3]) を実行し、グラフ描画を確認する。
2. Octaveのデータ型
Octaveのデータ型は行列のみである。本ページでは、行ベクトル、列ベクトル、スカラーという用語を次の意味で使用する。
- 行ベクトル: 1行m列の行列 (m>=1)
- 列ベクトル: n行1列の行列 (n>=1)
- スカラー: 1行1列の行列
Octaveでは、変数名の大文字と小文字を区別する。本ページでは、行ベクトル、列ベクトル、スカラーを表す変数名には小文字を、一般の行列を表す変数名には大文字を使用している。
3. 行ベクトル
行ベクトルのコンストラクタ
【要点】
行ベクトルは、1行m列の行列 (m>=1)である。
変数 t に、要素 2、1、3 の行ベクトル(要素がこの順で並ぶ)を格納する場合は次のように記述する。
t = [2 1 3]
- 行ベクトルのコンストラクタ
x = [1 2 3 4 5 6] - 全要素が 0 の行ベクトル: zeros関数
「zeros(1, m)」の形式で記述する。mは列数を表す。
x = zeros(1, 10) - 全要素が 1 の行ベクトル: ones関数
「ones(1, m)」の形式で記述する。mは列数を表す。
x = ones(1, 10) - 全要素が同じ値の行ベクトル
「zeros(1, m) + x」の形式で記述する。mは列数、xは設定したい値を表す。
x = zeros(1, 10) + 5 - 0 から 1 の一様乱数を要素に持つ行ベクトル: rand関数
「rand(1, m)」の形式で記述する。mは列数を表す。
x = rand(1, 10) - 平均 0、分散 1 の正規分布の乱数を要素に持つ行ベクトル: randn関数
「randn(1, m)」の形式で記述する。mは列数を表す。
x = randn(1, 10) - 等差数列(初項、公差、末項を指定)
初項、公差、末項を「:」で区切って指定する。
x = [3:2:9]「x = 3:2:9」と記述しても同じ結果となる。
また、初項と末項のみを「:」で区切る場合は、公差が1となる。
x = [2:4]「x = 2:4」と記述しても同じ結果となる。
- 等差数列(初項、末項、項数を指定): linspace関数
初項、末項、項数を指定する。グラフ作成時に有用である。
x = linspace(1, 500, 20) - 対数目盛り用の数列: logspace関数
「logspace(a, b, n)」の形式で記述し、10^a から 10^b までを対数目盛り上で等間隔に並べた n 個の数列を生成する(対数グラフの軸目盛りなどに用いる)。
x = logspace(0, 3, 20) - 空行列/空ベクトル []
要素の操作
- 参照(行ベクトル→スカラー)
要素番号による参照を行う。
x = [1 2 3 4 5 6] x(1) - 参照(行ベクトル→行ベクトル)
要素番号が格納された行ベクトル(または列ベクトル)による参照を行う。
x = [10 20 30 40 50 60] x([2 4 6]) x(1:3) x(1:2:5) - 要素の代入
要素番号による値の代入を行う。
x = [1 2 3 4 5 6] x(2) = 20要素番号が格納された行ベクトル(または列ベクトル)による代入を行う。
x = [1 2 3 4 5 6] x([3 4 5]) = [20 30 40] - 行ベクトルの連結
「[]」内にベクトルを並べて記述する。
x = [1 2 3] y = [4 5 6] [x y] - 要素の削除
x = [1 2 3 4 5 6] x(2) = [] y = [1 2 3 4 5 6] y([3 4 5]) = []
行ベクトルの演算
- 行ベクトルの要素のデータ型: class関数
x = [1 2 3 4 5 6] class(x) - サイズ: size関数
x = [1 2 3 4 5 6] size(x) - 転置(行ベクトル → 列ベクトル)
「.'」演算子による転置、「'」演算子による複素共役転置がある。
x = [1 2 3 4 5 6] x.' x' - 行ベクトルへのスカラー加算: +演算子
x = [1 2 3 4 5 6] x + 10 - 行ベクトルのスカラー倍: *演算子
x = [1 2 3 4 5 6] x * 3 - スカラーの行ベクトル要素による除算: ./演算子
x = [1 2 3 4 5 6] 3 ./ x - 行ベクトルとスカラーの等値比較: ==演算子
a = [1 2 3 2 2 5] a == 1
- ソート: sort関数
sort関数は、デフォルトで昇順でソートを行う。ソート順を明示的に指定する場合は、「sort(a, 'ascend')」または「sort(a, 'descend')」のように記述する。
- 内積: *演算子
x = [1 2 3] y = [4 5 6] x*y'
4. 列ベクトル
【要点】
変数 t に、要素 2、1、3 の列ベクトル(要素がこの順で並ぶ)を格納する場合は次のように記述する。
t = [2; 1; 3]
5. 行列
行列のコンストラクタ
【要点】
変数 M に2行2列の行列を格納する場合、次のような記法を使用する。
M = [1 3; 2 4]
この行列は次のように配置される。
1 3
2 4
- 行列のコンストラクタ
各行を「;」(セミコロン)で区切って記述する。
A = [1 2 3; 4 5 6] - 全要素が 0 の行列: zeros関数
「zeros(n, m)」と記述する。nは行数、mは列数を表す。
A = zeros(3, 4) - 全要素が 1 の行列: ones関数
「ones(n, m)」と記述する。nは行数、mは列数を表す。
A = ones(3, 4) - 全要素が同じ値の行列
「zeros(n, m) + x」と記述する。nは行数、mは列数、xは設定したい値を表す。
A = zeros(3, 4) + 5 - 単位行列: eye関数
「eye(n)」と記述する。nは行数(および列数)を表す。単位行列は正方行列(行数と列数が等しい行列)である。
A = eye(3) - 対角行列: diag関数
引数として指定したベクトルの要素が対角要素となる行列を生成する。
A = diag([1 2 3 4]) - 0 から 1 の一様乱数を要素に持つ行列: rand関数
「rand(n, m)」と記述する。nは行数、mは列数を表す。
x = rand(3, 4) - 平均 0、分散 1 の正規分布の乱数を要素に持つ行列: randn関数
「randn(n, m)」と記述する。nは行数、mは列数を表す。
x = randn(3, 4) - ベクトルを行列に変換: reshape関数
「reshape(v, n, m)」と記述する。vはベクトル、nは行数、mは列数を表す。
- メッシュグリッド: meshgrid関数
座標値のベクトルからメッシュグリッドを生成する。
[XX, YY] = meshgrid([0 1 2 3], [1 2 3])
使用例として、mesh関数による3次元表示を示す。
x = [0 1 2 3]; y = [1 2 3]; [XX, YY] = meshgrid(x, y); ZZ = XX.*YY; mesh(XX, YY, ZZ); close;
使用例として、contour関数による等高線表示を示す。
x = [0 1 2 3]; y = [1 2 3]; [XX, YY] = meshgrid(x, y); ZZ = XX.*YY; contour(XX, YY, ZZ); close;
- 空行列/空ベクトル []
行列の要素の操作
- 参照(行列→行列、行ベクトル、列ベクトル、スカラー)
-
参照時は、行番号と列番号をカンマで区切って指定する。
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] A(1, 1) A(3, 2)
-
範囲指定には「:」(コロン)を使用する。「2:4」は行ベクトル[2 3 4]を表す。「:」単独では、全ての行または全ての列を意味する。
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] A(1:2, 2:4) A(1:2, 2) A(1:2, :)
- 行番号や列番号はベクトルでの指定も可能である。
A(1:2, [2 4])
-
参照時は、行番号と列番号をカンマで区切って指定する。
- 条件に合致する行の選択
X = [1 102; 1 102; 2 101; 3 101; 3 103] X(:, 1) == 3 X( X(:, 1) == 3, : )
- 要素の代入
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] A(2, 3) = 60 A - 行の追加
同じ列数の行ベクトルまたは行列を連結する。以下の例では、A の後に「;」(セミコロン)を配置する。
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] B = [A; [13 14 15 16]] C = [A; [13 14 15 16; 17 18 19 20]] - 列の追加
同じ行数の列ベクトルまたは行列を連結する。半角スペースで区切って連結したい行列や列ベクトルを並べる。
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] B = [A [100; 101; 102]] C = [A [100 200; 101 201; 102 202]] - 行列の連結
行方向の連結には「;」(セミコロン)を使用する。
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] D = [13 14 15 16; 17 18 19 20] [A; D]
列方向の連結には半角スペースを使用する。
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] E = [20 21; 22 23; 24 25] [A E]
- 行の削除
空行列 [] を使用して削除を行う。
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] A([1 3], :) = [] A - 列の削除
空行列 [] を使用して削除を行う。
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] A(:, [1 3]) = [] A
行列の演算
- 行列の要素のデータ型: class関数
- 次元の取得: ndims関数
ベクトルの場合は2、行列の場合も2を返す(Octaveではベクトルも2次元の行列として扱われるため)。
- サイズ: size関数
行列の行数と列数はそれぞれ次のコマンドで取得できる。
size(mat, 1) size(mat, 2) - 転置(行列 → 行列)
「.'」演算子による転置、「'」演算子による複素共役転置がある。
A = [1 2 3; 4 5 6] A.' A' - 行列に同じ数を足す: +演算子
行列に同じ数を足す - 行列の定数倍: *演算子
- 行列と特定の値との比較: ==演算子
X = [1 2 3; 2 3 2; 2 2 3] X == 2
- 行列とベクトルの積、行列と行列の積: *演算子
行列とベクトルの積
行列と行列の積 - 除算(左除算): \演算子
A\y は、連立方程式 Ax = y の解 x を求める演算である。A\Y は、行列方程式 A*X = Y の解行列 X を求める。
- 除算(右除算): /演算子
A/Y = (Y'\A')' と定義される。A/Y は、行列方程式 X*A = Y の解行列 X を求める。
- 逆行列: inv関数
逆行列の例 - 固有値と固有ベクトル: eig関数
- 固有値のみを計算する場合: LAMBDA = eig(A)
固有値の例 - 固有値と固有ベクトルを同時に計算する場合: [V, LAMBDA] = eig(A)
固有ベクトルは行列Vの列ベクトルとして、固有値は行列LAMBDAの対角要素として得られる。これらは A * V = V * LAMBDA の関係を満たす。
固有値と固有ベクトルの例
- 固有値のみを計算する場合: LAMBDA = eig(A)
- 行列式: det関数
行列式の例 - 行列のトレース: trace関数
対角要素の和を計算する。
X = [1 2 3; 4 5 6; 7 8 9] trace(X)
- 特異値分解(Singular Value Decomposition、SVD): svd関数
X = [1 2 3; 4 5 6; 7 8 9] [U, S, V] = svd(X)
- LU分解: lu関数
x = rand(2000, 2000); [L, U, P] = lu(x);
LU分解の例 - 行列のランク: rank関数
非ゼロの特異値の個数を計算する。
X = [1 2 3; 4 5 6; 7 8 9] rank(X)
- QR分解(QR factorization): qr関数
X = [1 2 3; 4 5 6; 7 8 9] [Q, R, P] = qr(X)
- 分散共分散行列: cov関数
X = [11 12 13; 14 15 16; 19 18 17] cov(X)
- 2次元のコンボリューション: conv2関数
X = [1 2 3; 4 5 6; 7 8 9] B = [1 2; 3 4] Z = conv2(X, B, 'full')
6. スカラーに対する演算
Octaveでは、スカラーに対する演算を行列やベクトル(行ベクトルと列ベクトル)に適用できる。この場合、行列やベクトルの各要素に対して個別に演算が実行される。また、同じサイズの行列やベクトル同士であれば2項演算を適用できる。
四則演算
- 和: +
- 差: -
- 積: .*
行列やベクトルの各要素同士の積を計算する場合は.*演算子を使用する。
- 商: ./
行列やベクトルの各要素同士の商を計算する場合は./演算子を使用する。
t = [0.01:0.01:40.96]; plot( sin(t) ./ t );
- 剰余: mod
数学関数
- べき乗: ^
- 平方根: sqrt
- 絶対値: abs
- 偏角: angle
- 複素数の実部: real
- 複素数の虚部: imag
- 複素共役: conj
- 符号: sign
- 四捨五入: round
- 小数点以下切り捨て(0方向): fix
- 床関数: floor
- 天井関数: ceil
- 指数関数(eのべき乗): exp
- 自然対数: log
- 2を底とする対数: log2
- 10を底とする対数: log10
- サイン関数: sin
- コサイン関数: cos
- タンジェント関数: tan
- 逆サイン関数: asin
- 逆コサイン関数: acos
- 逆タンジェント関数: atan
- 2引数逆タンジェント関数: atan2
atan2(Y, X)は、(Y/X)の逆タンジェントを計算する。座標平面上の点(X, Y)の偏角を求める際に使用する。
- ベッセル関数: besselj(第1種)等
- ガンマ関数: gamma
論理演算
論理演算では、0を偽(FALSE)、0以外の値を真(TRUE)として扱う。比較演算の結果は、真の場合は1、偽の場合は0となる。
- 論理積(AND): &
- 論理和(OR): |
- 否定(NOT): ~
比較演算
行列やベクトルに対する比較演算は、各要素に対して個別に実行される。比較結果は、真の場合は1、偽の場合は0となる。
- より小さい: <
- 以下: <=
- より大きい: >
- 以上: >=
- 等しい: ==
- 等しくない: ~=
集約演算
- 最大値: max
行ベクトルからスカラー値を返す、または行列から各列の最大値を要素とする行ベクトルを返す。
- 最小値: min
行ベクトルからスカラー値を返す、または行列から各列の最小値を要素とする行ベクトルを返す。
- 平均値: mean
行ベクトルからスカラー値を返す、または行列から各列の平均値を要素とする行ベクトルを返す。
- 総和: sum
行ベクトルからスカラー値を返す、または行列から各列の総和を要素とする行ベクトルを返す。
- 要素数: length
ベクトルの要素数を返す、または行列の最大次元のサイズを返す。
集約演算の使用例を以下に示す。
x = [1 2 3 4 5 6];
max(x)
min(x)
mean(x)
sum(x)
length(x)
グラフ描画関数
- plot:2次元プロットの描画
- plot3:3次元プロットの描画
- view:3次元プロットの視点設定
- title:グラフタイトルの設定
- xlabel:x軸ラベルの設定
- ylabel:y軸ラベルの設定
- zlabel:z軸ラベルの設定
- axis:グラフ範囲の指定
- grid:グリッド線の表示制御
- legend:凡例の表示
- hist:ヒストグラムの描画
度数分布のヒストグラムデータのみを取得する場合はhistc関数を使用する。
ヒストグラム描画例を以下に示す。区間の中央値を[-4 -3 -2 -1 0 1 2 3]とする。
v = randn(1, 2000); hist( v, [-4 -3 -2 -1 0 1 2 3] ); close;
- hist3:2次元ヒストグラムの描画(statisticsパッケージ)
- ginput:マウスによる座標入力
7. その他の関数
最適化関数
- fminbnd:区間内での1変数関数の最小値探索
- fzero:1変数関数の零点探索
信号処理関数
- conv:畳み込み演算(コンボリューション)
2つのベクトル間の畳み込み演算を実行する。
- deconv:逆畳み込み演算
- conv2:2次元畳み込み演算
2つの行列間の畳み込み演算を実行する。
- fft:高速フーリエ変換
- ifft:逆高速フーリエ変換
- fft2:2次元高速フーリエ変換
- ifft2:2次元逆高速フーリエ変換
- fftshift:フーリエ変換結果の並べ替え
配列やベクトルの中央に周波数0の成分が来るように並び替えを行う。
フィルタリング関数
- filter:フィルタ処理の実行
インパルス応答の計算例を以下に示す。
plot( filter(1, [1 0.9], [1 zeros(1, 99)]') );
- fir1:単一帯域FIRフィルタの設計(窓関数法)
ローパス、ハイパス、バンドパス、バンドストップフィルタの設計が可能である。
- fir2:複数帯域FIRフィルタの設計(窓関数法)
- firls:複数帯域FIRフィルタの設計(最小二乗法)
- remez:複数帯域FIRフィルタの設計(ミニマックス法)
- butter:バターワースフィルタの設計
- filtfilt:ゼロ位相フィルタ処理
- hamming:ハミング窓関数
- hanning:ハニング窓関数
- bartlett:バートレット窓関数
- blackman:ブラックマン窓関数
- kaiser:カイザー窓関数
補間関数
- interp1:1次元補間
- interp2:2次元補間
8. 制御構造
- forループ
- whileループ
- if条件分岐
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モジュールを呼び出すためのパッケージ)を導入する。以下の準備が必要である。
- Pythonのインストール(python.orgからダウンロード)
- 連携に用いるPythonパッケージ(NumPy等)のインストール(pip install numpy scipy で実行)
- pythonicパッケージのインストール
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関数を使用して確認する。
段階的なデバッグ: 複雑な処理を分割し、各段階での中間結果を確認することで、エラーの原因を特定しやすくなる。