Octaveによる数値計算とデータ処理の基礎
Octaveのデータ型は行列のみであり,行ベクトル(1行m列),列ベクトル(n行1列),スカラー(1行1列)はすべて行列として扱われる.基本的な演算には,四則演算(+,-,.*,./),数学関数(sqrt,abs,exp,log等),論理演算(&,|,),比較演算(<,<=,>,>=,==,=)がある.行列操作では,転置(.'),複素共役転置('),行列積(*),逆行列(inv),固有値・固有ベクトル(eig)等が利用可能である.また,行列の要素へのアクセスは行番号と列番号をカンマで区切って指定する.プログラム制御にはfor文,while文,if文が使用でき,ファイル入出力ではCSV,テキスト,Excel,バイナリ形式等に対応している.さらに,外部ライブラリとの連携やPython,C/C++との連携も可能である.エラー処理にはtry-catch構文が利用でき,デバッグにはブレークポイントの設定や変数状態の確認等の機能が提供されている.
【目次】
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]) を実行し,グラフ描画を確認する.
Octaveのデータ型
Octaveのデータ型は行列のみである. このページでは,行ベクトル,列ベクトル,スカラーという用語を次の意味で使用する.
- 行ベクトル: 1行m列の行列 (m>=1)
- 列ベクトル: n行1列の行列 (n>=1)
- スカラー: 1行1列の行列
Octaveでは,変数名の大文字と小文字を区別する必要がある. 本ページでは,行ベクトル,列ベクトル,スカラーを表す変数名には小文字を,一般の行列を表す変数名には大文字を使用している.
行ベクトル
行ベクトルのコンストラクタ
【要点】
行ベクトルは,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関数
「zeros(1,m) + x」の形式で記述する.mは列数を表す.
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関数
対数グラフ上で等間隔となる数列を生成する.
x = logspace(1,500,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 = [1 2 3 4 5 6] 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関数は,デフォルトで昇順(increasing order)でソートを行う. ソート順を明示的に指定する場合は, 「sort(a,'ascend')」または「sort(a,'descend')」 のように記述する.
- 内積: *演算子(行ベクトル 列ベクトル → スカラー)
x = [1 2 3] y = [4 5 6] x*y'
列ベクトル
【要点】
変数 t に,要素 2,1,3 の列ベクトル(要素がこの順で並ぶ)を格納する場合は,
t = [2; 1; 3]
行列
行列のコンストラクタ
【要点】
変数 M に2行2列の行列(つまり,要素1,2,3,4が以下のように配置された行列)を格納する場合,
1 3
2 4
次のような記法を使用する.
M = [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 と + を利用
「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(v,n,m)」と記述する.ここで,v はベクトル,n は行数,m は列数を表す.
- メッシュグリッド meshgrid
例えば,x座標値のベクトル [0 1 2 3] と y座標値のベクトル [1 2 3] からメッシュグリッドを生成する場合,次のように記述する.
[XX,YY] = meshgrid([0 1 2 3],[1 2 3])
(例)meshgrid の使用例.mesh関数による3次元表示
x = [0 1 2 3]; y = [1 2 3]; [XX,YY] = meshgrid(x,y); ZZ = XX.*YY; mesh(XX,YY,ZZ); close;
(例)meshgrid の使用例.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
ベクトルの場合は1,行列の場合は2を返す値である.
- サイズ: size
行列の縦と横のサイズはそれぞれ次のコマンドで取得できる:
size(mat,1) size(mat,2)
- 転置 (行列 → 行列)
「.'」演算子による単純転置を行う.
- 転置 (行列 → 行列)
「'」演算子による複素共役転置を行う.次の例で示す:
x = [1 2 3 4 5 6] x'
- 行列に同じ数を足す: + (行列 → 行列)
* 要素単位の演算については,このWebページの後半で詳しく説明している.
行列に同じ数を足す - 行列の定数倍: * (行列 → 行列)
* 要素単位の演算については,このWebページの後半で詳しく説明している.
- 行列と特定の値との比較: == (行列 →行列)
X = [1 2 3; 2 3 2; 2 2 3] X == 2
- 行列とベクトルの積,あるいは行列と行列の積: *
行列とベクトルの積
行列と行列の積 - 除算(左除算; left division): \
A\y は,行列Aとベクトルyから連立方程式Ax = yの解xを求める演算である. 同様に,A\Yは,行列AとYから行列方程式A*X = Yの解行列Xを求める.
- 除算(右除算; right division): /
右除算は左除算を用いて実装されており,A/Y = (Y'\A')'と定義される. 具体的には,A/Yは行列AとYから行列方程式X*A = Yの解行列Xを求める.
- 逆行列: inv
逆行列の例 - 固有値と固有ベクトル: eig
行列の固有値(eigenvalue)と固有ベクトル(eigenvectors)を計算する関数である. 計算過程では,まずヘッセンベルグ分解(Hessenberg decomposition)関数hessを適用し, 続いてシューア分解(Schur decomposition)関数schurを使用する.
- 固有値のみを計算する場合: LAMBDA = eig(A)
固有値の例 - 固有値と固有ベクトルを同時に計算する場合: [V,LAMBDA] = eig(A)
固有ベクトルは行列Vの列ベクトルとして,固有値は行列LAMBDAの対角要素として得られる. これらは A * V = V * LAMBDA の関係を満たす.
固有値と固有ベクトルの例
- 固有値のみを計算する場合: LAMBDA = eig(A)
- 正方行列(square matrix)の行列式: det
行列式の例 - 行列のトレース(trace): trace
対角要素の和sum(diag(X))を計算する関数である.
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)
- 正方行列(square matrix)のLU分解: lu
LAPACK(Linear Algebra PACKage)の機能を利用して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')
スカラーに対する演算
Octaveでは,スカラーに対する演算を行列やベクトル(行ベクトルと列ベクトル)に適用できる. この場合,行列やベクトルの各要素に対して個別に演算が実行される. また,同じサイズの行列やベクトル同士であれば2項演算を適用できる.
四則演算
- 和: +
- 差: -
- 積: .* 行列やベクトルの各要素同士の積を計算する場合は.*演算子を使用する.
- 商: ./
行列やベクトルの各要素同士の商を計算する場合は./演算子を使用する.
t = [0.01:0.01:40.96] plot( sin(t) ./ t );
- 剰余: mod
数学関数
- べき乗: ^
- 平方根: sqrt
- 絶対値: abs
- 偏角: angle
- 複素数の実部 (real part): real
- 複素数の虚部 (imaginary part): imag
- 複素共役: conj
- 符号: sign
- 四捨五入: round
- 小数点以下切り捨て: 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)の偏角を求める際に使用する.
- ベッセル関数: bessel
- ガンマ関数: 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
- 2次元ヒストグラム描画: hist2d
- マウスによる座標入力: ginput
その他の関数
- 1変数関数の最小値探索: fmin
pkg load optim
- 1変数関数の零点探索: fzero
pkg load optim (未確認)
- 畳み込み演算(コンボリューション): conv (ベクトル同士の演算)
2つのベクトル間の畳み込み演算を実行する.
- 逆畳み込み演算: deconv
- 2次元畳み込み演算: conv2 (行列同士の演算)
2つの行列間の畳み込み演算を実行する.
- 高速フーリエ変換: fft
- 逆高速フーリエ変換: ifft
- 2次元高速フーリエ変換: fft2
- 2次元逆高速フーリエ変換: ifft2
- フーリエ変換結果の並べ替え: fftshift 配列やベクトルの中央に周波数0の成分が来るように並び替えを行う.
フィルタリング関数
- インパルス応答
(例)filter関数によるインパルス応答の計算例
plot( filter(1,[1 0.9],[1 zeros(1,99)']) )
- 単一帯域FIRフィルタの設計(窓関数法): fir1
ローパス,ハイパス,バンドパス,バンドストップフィルタの設計が可能.
- 複数帯域FIRフィルタの設計(窓関数法): fir2
- 複数帯域FIRフィルタの設計(最小二乗法): firls
- 複数帯域FIRフィルタの設計(ミニマックス法): remez
- バターワースフィルタの設計: butter
- フィルタ処理の実行: fifilt
- ハミング窓関数: hamming
- ハニング窓関数: hanning
- バートレット窓関数: bartlett
- ブラックマン窓関数: blackman
- カイザー窓関数: kaiser
- 画像のエッジ検出:?
- 2次元フィルタ処理:?
- 1次元補間: interp1
- 2次元補間: interp2
制御構造
- forループ
- whileループ
- if条件分岐
外部ライブラリとの連携
【要点】
Octaveでは,外部ライブラリやPython等との連携により,機能を拡張できる.Windowsでの手順を説明する.
Forgeパッケージの利用
- パッケージの管理: 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(3.8以降)のインストール(python.orgからダウンロード)
- Octave 6.0以降のインストール
- NumPy,SciPyのインストール(pip install numpy scipy)
- PATHの設定確認
- Python連携の初期設定
# Pythonのパスを指定(例) setenv("PYTHON", "C:/Program Files/Python312/python.exe"); py_init; % Python環境の初期化
- Pythonコードの実行: py_eval関数
py_eval("import numpy as np"); py_eval("x = np.array([1, 2, 3])"); result = py_eval("x * 2"); % Python配列の演算
- データの受け渡し
% OctaveからPythonへ x = [1 2 3; 4 5 6]; py_eval("y = np.array(" + mat2str(x) + ")"); % PythonからOctaveへ result = py_eval("y.tolist()");
C/C++との連携
- MEXファイルの利用
Windows環境では,MinGW-w64コンパイラを使用してMEXファイルをビルドする.
% MEXファイルのコンパイル mkoctfile --mex example.cpp % MEXファイルの使用 result = example(input_data);
- 動的ライブラリの利用
% Windowsの場合,DLLを使用 loadlibrary('example.dll', 'example.h'); result = calllib('example', 'function_name', args); unloadlibrary('example');
Windowsシステムコマンドとの連携
- システムコマンドの実行: system関数
[status, output] = system('dir'); % Windowsコマンドの実行 status = system('explorer .'); % エクスプローラーを開く
- 環境変数の操作
getenv('PATH'); % 環境変数の取得 setenv('CUSTOM_VAR', 'value'); % 環境変数の設定
連携時の注意点
- メモリ管理
外部ライブラリとの連携時は,メモリリークに注意が必要である.特に大規模なデータを扱う場合は,適切なクリーンアップ処理を実装する.
- エラー処理
外部連携時のエラーは,try-catch構文で適切に処理する必要がある.特にPython連携時は,Pythonの例外をOctave側で捕捉する.
- パス設定の確認
外部ライブラリやPythonとの連携時は,システムのPATH設定が正しく行われていることを確認する.不適切なPATH設定は,予期せぬエラーの原因となる.
ファイルの入出力
【要点】
Octaveでは,様々な形式のファイルの読み書きが可能である.特に数値データの入出力において強力な機能を提供している.
CSVファイルの操作
- CSVファイルの読み込み: csvread関数
data = csvread('input.csv'); % 基本的な読み込み data = csvread('input.csv', 1, 0); % 2行目から読み込み(ヘッダーをスキップ) data = csvread('input.csv', 0, 0, [0 0 2 3]); % 特定範囲の読み込み
- CSVファイルの書き込み: csvwrite関数
A = [1 2 3; 4 5 6; 7 8 9]; csvwrite('output.csv', A); % 基本的な書き込み csvwrite('output.csv', A, 1, 0); % 2行目から書き込み
- 区切り文字の指定: dlmread関数,dlmwrite関数
data = dlmread('input.txt', '\t'); % タブ区切りファイルの読み込み dlmwrite('output.txt', A, '\t'); % タブ区切りファイルの書き込み
テキストファイルの操作
- テキストファイルの読み込み: textread関数
[names, ages] = textread('data.txt', '%s %d'); % 文字列と数値の読み込み 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-packageの導入が必要である. インストールは以下のコマンドで実行する:
pkg install -forge io pkg load io
- Excelファイルの読み込み: xlsread関数
[num, txt, raw] = xlsread('data.xlsx'); % 数値,テキスト,全データの読み込み data = xlsread('data.xlsx', 'Sheet1'); % 特定シートの読み込み data = xlsread('data.xlsx', 'A1:D10'); % 特定範囲の読み込み
- Excelファイルの書き込み: xlswrite関数
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);
- MAT形式ファイルの操作: save関数,load関数
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'); % パスの結合
エラー処理とデバッグ手法
基本的なエラー処理
【要点】
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 % プロファイリング終了 profile report % 結果レポートを表示
デバッグ時の表示制御
- 出力の詳細度制御: verbosity関数
verbosity(0); % 最小限の出力 verbosity(1); % 通常の出力 verbosity(2); % 詳細な出力
- デバッグ用メッセージの出力: disp関数,printf関数
disp('デバッグメッセージ'); printf('変数xの値: %f\n', x);
- 実行の一時停止: pause関数
pause; % キー入力まで待機 pause(2); % 2秒間待機
エラー発生時の推奨対応
- エラーメッセージの解析
エラーメッセージには,エラーの種類,発生場所,原因が含まれている.これらを注意深く読み解くことが重要である.
- スタックトレースの確認
エラー発生時のスタックトレースを確認することで,エラーが発生するまでの関数呼び出しの流れを把握できる.
- 変数の型とサイズの確認
行列演算におけるエラーの多くは,変数の型やサイズの不一致によって発生する.whos関数を使用して確認することが有効である.
- 段階的なデバッグ
複雑な処理を分割し,各段階での中間結果を確認することで,エラーの原因を特定しやすくなる.