Appendix 1

MATLABでオブジェクト指向プログラミング 村松 正吾
オブジェクト指向プログラミングは，大規模なアプリケークトリの下に関数として定義するション・ソフトウェアを開発する際に効率化をもたらします．

¡メソッドは，引き数にインスタンス・オブジェクトをもつ．

ソフトウェアをオブジェクト（部品）の組み合わせとして設計すフィールドを更新するメソッドは，インスタンス・オブることで，開発期間の短縮と信頼性の向上が期待できます．

ジェクトを戻り値とする

C++ や Java と同じように，MATLAB でも「状態」と「振る舞では早速，本特集 第 1 章のい」をもつオブジェクトを基本としたアプリケーション・ソフの E ステップと M ス

テップをオブジェクト指向でプログラムしてみましょう．

トウェア開発が可能です．

● MATLAB オブジェクト指向プログラミングへの誘い

クラス定義とオブジェクト生成

汎用性のある安全なオブジェクトを設計することで，再利用

本特集 第 1 章のリスト 8（p.64）に示した繰り返し演算解法しやすい部品が整います．さらに，保守性を向上させるために，（EM アルゴリズム）をオブジェクト指向プログラミングでMATLAB には単体テストの環境が用意されています（右掲の実装してみましょう．

コラム 1 を参照）．
MATLAB におけるオブジェクト指向プログラミングのポイントを以下にまとめます．
¡オブジェクトの型枠となるクラスの定義は，@ で始まるディレクトリで行う

まず，型枠となるクラスを定義します．ディレクトリ
@EmSteps を作成しましょう． ディレクトリ @EmSteps の下に，以下の三つの関数を準備します．
@EmSteps¡実体（インスタンス）オブジェクトを生成する関数（コンストラクタ）は，@ を除いたディレクトリ名と同じ名前の M

EmSteps.m（コンストラクタ）
process.m（EM ステップ実行メソッド）
get.m（フィールド取得メソッド）

M ファイル EmSteps.m はインスタンス・オブジェクトを生ファイルとする¡コンストラクタは状態を保持する変数（フィールド）を構造体として定義し，関数 class で実体オブジェクトに変換する¡オブジェクトの振る舞い（メソッド）は，@ で始まるディレ

リスト 1 EmSteps コンストラクタ
function emSteps = EmSteps(X,nDists)%% EmSteps コンストラクタ%% emSteps = EmSteps(X,nDists)%% X:
データ(DxN)% nDists:
混合数 K%nDims = size(X,1);% 次元 D の抽出% フィールド（構造体メンバ）の定義
emSteps.X = X;
% データ
emSteps.setPi = ...
% 混合係数群(1xK or Kx1)
ones(1,nDists) / nDists;
emSteps.setMu = ...
% 平均ベクトル群(DxK)
rand(nDims,nDists)-.5;
emSteps.setSigma = ... % 共分散行列群(DxDxK)
repmat(eye(nDims),[1 1 nDists]);% 構造体から EmSteps オブジェクトへの変換
emSteps = class(emSteps,'EmSteps');66

リスト 2 process メソッド
function emSteps = process(emSteps)%% process メソッド%
% emSteps = process(emSteps)%% フィールドの抽出
X = emSteps.X;% データ
setPi = emSteps.setPi;% 混合係数群
setMu = emSteps.setMu;% 平均ベクトル群
setSigma = emSteps.setSigma;% 共分散行列群% その他変数nDists = length(setPi);
nSamples = size(X,2);
res = zeros(nSamples,nDists);%--- EM ステップ開始 --%:% 省略（リスト 8 と同じ）%:%--- EM ステップ終了 --% フィールド（パラメータ）の更新
emSteps.setPi = setPi;
emSteps.setMu = setMu;
emSteps.setSigma = setSigma;

KEYWORD ―― MATLAB，オブジェクト指向，EM アルゴリズム，インスタンス，クラス，単体テスト，メソッド，コンストラクタ，ベイズ決定則，肌色識別% 混合数 K の抽出% 標本数 N の抽出% 分布の重みγ(zik)% 混合係数群% 平均ベクトル群% 共分散行列群

Oct. 2007

Appendix 1 MATLAB でオブジェクト指向プログラミング

コラム 1

単体テスト環境部品でもシステムでも何かモノを作るときには，それが正しく機利用前に以下の手続きが必要になります．

能するか否かを確認する必要があります．これが「テスト」です．一

1）ファイル mlunit1.5.1.zip を任意のディレクトリ $HOME に展開

言で「テスト」といっても，さまざまな手法があります．作ろうとす

2）MATLAB コマンド・ウィンドウ上でディレクトリを移動るモノの仕様を定め，それを満足するか否かを実装後にテストする>> cd $HOME/mlunit/src

方法もあれば，小さな機能をテストしながら実装を進める方法もあ3）インストール・メソッドを実行ります．

1
App1>> install(mlunit);

小さな機能テストは，簡単に即座に繰り返し実行できます．必要最小限の機能のテストだけを定義し，それを満足する機能を実装し，これを発展的に繰り返すことで部品やシステムを作り上げる「テスト駆動型開発」という開発手法があります．

24）MATLAB パスにディレクトリを追加>> addpath( $HOME/mlunit/src );上記の手続きのあと，メソッド assert は mlunit_assert に改名されます．

3

テスト駆動型開発では，仕様は発展的に変化します．実装の変化も容認します．実装の変更は正しい機能への脅威となりますが，細かいテストの定義が，開発者に変更の勇気を与えてくれます．単体

4

テスト環境は，このテスト駆動型開発を支援するツールです．
MATLAB にもいくつかの単体テスト環境があります．MATLAB

App3Central File Exchange サイト（http://www.mathworks.com/matlabcentral/fileexchange/）で unit testing というキーワー

5ドを検索してみてください．
MATLAB R2007a に対応した単体テスト環境に mlUnit があります（図 A）．mlUnit の Web サイト（http://mlunit.dohmke.de/Main_Page）からツールをダウンロードできます．本稿執筆時点のバージョンは 1.5.1 です．なお，同ツール内のメソッド assert がR2007a にあらかじめ用意されている組み込み関数と重複するため，成するコンストラクタを定義します．ディレクトリ名から @ を取った名前にします．

図A
mlUnit の実行例

用して出力します．
クラス EmSteps を利用することで，第 1 章のリスト 8 の関数コンストラクタ EmSteps のソース・コードをリスト 1 に示します．データ群 X を引き数として受け， 混合係数群，平均emmixmvncq はリスト 4 のように修正できます．クラス EmStepsのオブジェクトは部品として利用できるようになります．

ベクトル群，共分散行列群の初期パラメータをフィールドとしオブジェクト指向プログラミングでは，既に作成したクラスて設定しています．これらをいったん，構造体として定義し，を拡張できる「継承」の仕掛けが特徴の一つといえます．MAT

関数 class でインスタンス・オブジェクトに変換しています．

LAB におけるクラスの継承は，関数 class で次のように実現

MATLAB における構造体の定義は，.（ドット）に続けてメンします．

バ変数名を記述するだけです．

childObj =...

process.m は，EM ステップ（1 回分）のメソッドを実装します．第 1 章のリスト 8 と同じ部分は省略してリスト 2 にソース・コードを記載します．メソッド process では，入力にクラス EmSteps のインスタンス・オブジェクト emSteps を受けます．このメソッドは，フィールドを更新するので，更新した後のインスタンス・オブジェクトを出力する必要があります．
なお，オブジェクトの状態（フィールド）は隠ぺいされており，外部からアクセスできません．外部から状態を観測するために，メソッド get を定義します．リスト 3 にソース・コードを記載します．メソッド get では，インスタンス・オブジェク
ト emSteps を受けます．このメソッドは，引き数 fieldName

リスト 3 get メソッド
function value = get(emSteps,fieldName)%% get メソッド%% value = get(emStepObj,fieldName)%switch fieldName % 分岐処理
case 'setPi'% 混合係数群
value = emSteps.setPi;case 'setMu'% 平均ベクトル群
value = emSteps.setMu;
case 'setSigma'% 共分散行列群
value = emSteps.setSigma;
otherwise% その他（エラー）error([fieldName,'有効なフィールド名ではありません'])
endで指定されたフィールドの値を switch 文による条件分岐を利Oct. 2007

App2

News Flash ――シーネットワークスジャパン，IT 製品資料請求サイトをリニューアルして ZDNet Japan に統合
シーネットワークスジャパンは，企業向け IT 製品の一括資料請求サイト「IT 製品比較.com」をリニューアルし，同社が運営する ZDNet
Japan の「IT 製品比較」サイトとして運営を開始した．同社は 2006 年 12 月に本サイトを立ち上げたカレンから事業の譲渡を受けていた．

67