MATLAB


サイバネットシステム株式会社 http://www.cybernet.co.jp/matlab/ の 技術解説書 クイックスタート を参考にしています. 

1.はじめに

MATLAB®は,一種の直感的な高級プログラミング言語を使ったテクニカルコンピューティング環境です。

データ解析、可視化、アルゴリズム開発、アプリケーション開発のためのコアとなる数値演算機能と高度なグラフィカルツールを提供します。MATLAB 環境がもつ600以上の数学、統計、工学の関数を使って、エンジニアと科学者のテクニカルコンピューティング環境として利用されています。

MATLABという名前は,MATrix LABoratory (行列実験室) を意味してします.MATLABは,当初LINPACK, EISPACKプロジェクトによって開発された行列ソフトウェアへのアクセスを用意にする目的で書かれました.現在,MATLABは,LAPACKARPACKプロジェクトによって開発されたソフトウェアを使用しています.

 

MATLABの特徴として,

  • データの扱いが簡単

変数の型の宣言や配列の宣言等を行う必要がない.

データはすべて配列として扱うため行列ベースの処理を直接的に表現可能.

  • MALAB言語による簡単なプログラミング機能

CC++)Fortran言語などのように変数の型宣言や配列宣言を書く必要がない.

多くの関数・コマンドのソースコード(MATLAB言語)が公開されている.

  • 豊富なグラフィックス機能

豊富なグラフィックス関数により,煩雑なコードを書く必要がない.

グラフィックスのカスタマイズやGUIを構築する機能が充実.

    以上の特徴により,プログラミングや数値計算の専門的な知識が無くても気軽に利用できる応用的なテクニカルコンピューティング環境です.


2.作業ファイルの設定 *** 注意 ***

matlab1の上で,右クリックして,「プロパティ(R)」 を選択します(現在は,バージョン2008aが入っているので注意).

ここで,作業フォルダを Z:\  に変更します.

この作業ファイルの設定は,工学部7階教育用計算機の設定では,再起動をすると元に戻るようになっているため,Matlabを使う時は必ず最初に設定しなければなりません.


3MATLABの基本操作

3.1 操作環境


3.1.1
起動と終了

MATLABの起動:

matlab1
上のショートカットアイコンをダブルクリックするか,「スタートメニュー」から プログラム -> MATLAB を選択します(現在は,バージョン2008aが入っているので注意).

この演習では,「2.作業ファイルの設定」 で,ショートカットアイコンの作業ファイルを変更したので,ショートカットアイコンをダブルクリックします.

注意 起動には,23分の時間がかかるので,気長に待つこと.何度もアイコンをダブルクリックすると,多数のMatlabが起動し,さらに遅くなるので注意する.

MATLABの終了:

終了するには,Command Windowで,quitコマンド,または,exitコマンドを実行します.


3.1.2
ディスクトップ環境

MATLABを起動すると,以下のウィンドウが表示されます.

 

各ウィンドウの機能は,次の通りです.

1.コマンドウィンドウ
  最も頻繁に使用するウィンドウです.ここから各種コマンド・関数・プログラムを実行します.

2.ワークスペース
  MATLAB上に定義された変数の一覧を表示します.

3.カレントディレクトリ
  フォルダやファイルのエクスプローラウィンドウです.

4.コマンド履歴
  コマンドウィンドウで実行してきたステートメントの履歴を表示します.

 

3.1.3 ファイル管理コマンド

MTALABではファイルシステムがディレクトリ(フォルダ)によって管理されています.下記では,カレントディレクトリの確認とディレクトリの作成,移動の一連の作業を実行します.

pwd

カレントの作業ディレクトリの表示

dir

ディレクトリのファイルリストの表示

mkdir

ディレクトリの作成

cd

ディレクトリの移動

 

Command Window で,次のファイル管理コマンドを入力してみよう.

●カレントの作業ディレクトリを表示

    >> pwd
    ans  =  
             Z
\

●ディレクトリのファイルリストを表示

    >> dir
   
....

●ディレクトリの作成と移動,表示

    >> mkdir TEST
    >> cd TEST
    >> pwd
    ans  =
              Z
\TEST


3.2 データの定義

MATLABでは,数値と文字の2つのデータタイプを主に扱うことができます.データ定義の際は,データ型や配列サイズの宣言が不要です.このため,簡潔な記述でデータ定義を行うことが可能です.

3.2.1 変数と代入

  >>  a = 5
    a  =
            5

aという変数に,数字の5を代入します.= は,代入を意味します.

MATLAB変数名は,最初のキャラクタを文字とし,それに続くキャラクタを文字,数字,アンダースコアを組み合わせて作成します.MATLABでは,変数名の大文字,小文字を区別します.

  >> A = a
    A =
            5

Aという変数に,変数aの値を代入します.


3.2.2
行列の作成

・要素の全体は,鍵括弧[ ]で囲みます.
・各要素はブランク,タブ,またはカンマで区切ります.
・各行はセミコロン; または,キャリッジリターンで区切ります.
・文字データを定義する場合は,要素全体をシングルコート’ で囲みます.

2行3列の実数行列Bを定義する場合,下記のステートメントを実行します.実行するとWorkspaceウィンドウに変数Bが表示され,MATLAB上に変数Bが定義されたことが確認できます.(whosコマンドでも可).なお,ステートメントの最後にセミコロンを付けないと,Command Windowに表示されますが,セミコロンをつけて実行すると結果を表示しません.

●2行3列の実数行列B,結果の表示(セミコロン無し)

  >> B = [ 1 2 3 4 5 6]
    B =   1     2     3
            4     5     6  

●結果の非表示(セミコロン有り) 

  >> B = [ 1 2 3 4 5 6]

●行列の転置

行列を転置演算するには,アポストロフまたは,シングルコーテーション’ を用いる.これは,主対角に対して行列を入れ替え,行ベクトルを列ベクトルにします.

  >> B
    ans =  
             1    4
             2    5
             3    6

     >> B
(:)’
  ans = 
            1  4  2  5  3  6


3.2.3
様々な行列の使用

単位行列のような基本的な行列を定義する場合,下記の表に掲載されている関数を使うことで簡単に作成できます.

zeros

ゼロ行列

rand

一様分布する乱数

ones

1行列

randn

正規分布する乱数

eye

単位行列

linspace

線形等間隔ベクトル

diag

対角行列

logspace

対数等間隔ベクトル

magic

魔方陣

等間隔ベクトル

例えば,3行2列のゼロ行列 d1 を定義する場合は,下記のステートメントを実行します.関数名の後の丸括弧内の値は,その関数に渡されるパラメータ値で,入力引数といいます.なお,zeros関数に対する入力引数は,行列の行数,列数(サイズ)を決定します.

●3行2列のゼロ行列  d1

    >> d1 = zeros(32)
    d1 = 
            0        0
            0        0
            0        0

次に,1行5列の等間隔ベクトルを定義します.等間隔ベクトルを生成する場合は,コロン演算子(:)をつかって次の形式で定義できます.

変数名 = 初期値 : 増分 : 最終値

●1行5列の等間隔ベクトル(初期値2,増分−1,最終値−2) d2

    >> d2 = 2-1-2
    d2 =
            2      1      0      -1      -2

なお,増分が1の場合は増分を省略することができ,次の書式で定義できます.

変数名 = 初期値 : 最終値

●1行10列の等間隔ベクトル(初期値1,増分1,最終値10) d3

    >> d3 = 110
    d3 =
           1      2      3      4     5      6      7      8      9      10

●区間(0.01.0)に一様分布する乱数を2行5列のベクトルに格納する d4

    >> d4 = rand(25)
    d4  =
      0.2476    0.5683    0.8756    0.6531    0.6489
      0.1380    0.1834    0.4143    0.6359    0.7692

 

3.2.4 ファイルから定義

  ファイルからデータを読み込む際は,インポート関数を使います.この関数はデータを読み込みMATLABのデータタイプに自動的に変換します.ファイルフォーマットに応じて下記のインポート関数があります.

代表的なインポート関数一覧

load

MATファイルおよび,ブランク区切りのファイル

dlmread

任意の区切り文字で区切られたファイル

textread

フォーマット付数値,文字を含むファイル

xllread

Excel スプレッドシードファイル

imread

画像ファイル

wavread

Wave サウンドファイル

aviread

AVIファイル

 

3.2.5 行列の配列操作

MATLABでは定義されている変数に対して,下記の操作を簡単に実行することができます.

  1. 要素の抽出
  2. 要素の置き換え
  3. 行列の結合

はじめに,2行3列の行列を作ります.

    >> A = [ 1 2 3 4 5 6]
    A =
           1      2      3
           4      5      6

a. 要素の抽出
   
 次の書式で実行します. M = 変数名(ij)      ij は変数の行・列番号

●変数Aの2行3列目の要素

    >> m1 = A(23)
    m1 =
            6

●変数Aの2行の1,2,3列目の要素

    >> m2 = A(2[13])
    m2 =
            4          5          6

b. 要素の置き換え

 次の書式で実行します.  変数名(i,  j) = N    i, j は変数の行・列番号,Nは置き換える値
要素の抽出でも同様ですが,行・列番号の部分にコロン(:)を使うと,すべての行・列要素を指定することになります.2つ目の例では,1列目のすべての行要素を指定しています.

●変数Aの2行2列を1にする

    >> A(22) =1
    A =
            1      2      3
            4      1      6

●変数Aの1列目をすべて10にする

    >> A(:,1) = 10
  A =
            10       2       3
            10       1       6

c. 行列の結合

通常のデータ定義のように,鍵括弧 [ ] を使用して実行します.縦に結合する場合は,セミコロンで改行を指定する必要があります.

●行列 m1 m2 を横に結合

    >> m12 = [m1 m2]
    m12 =
             6     4     5     6

●行列 m2 m2 を縦に結合

    >> m22 = [m2 ; m2]
    m22 =
             4       5       6
             4       5       6


3.3 データの管理

MATLABでは,配列宣言などのメモリ管理をユーザに要求しません.MATLABにデータが入力(定義)されると,そのデータのためのメモリが割り当てられます.この割り当てられたメモリ領域をワークスペースと呼びます.この領域にあるデータは,MATLABを終了するか,または削除(clearコマンドを実行)されるまで保持されます.

なお,既に割り当てられている変数と同じ変数名を使用した場合,例え異なる配列データであっても,ワーニング無しに上書きしてしまいますので,注意してください.

who

ワークスペース内の変数一覧

whos

ワークスペース内の変数一覧(詳細)

clear

ワークスペース内の変数やメモリ内の関数を削除


3.4  数値演算

3.4.1 四則演算

MATLAB四則演算子は,単に要素毎の演算ばかりでなく,行列演算も実行可能です.

加算

*

要素毎の乗算

減算

/

要素毎の除算

 *

行列の乗算

\

要素毎の除算

 /

行列の除算(右割り)

.^

要素毎のベキ乗

 \

行列の除算(左割り)

 

 

 

行列のベキ乗

 

 

●行列ABを定義

    >> A = [ 1 2 3 4]
    A =
          1        2
          3        4

    >> B = [ 3 5
-4 2]
    B =
          3        5
        -4        2

●行列ABの加算,行列Aのすべての要素から1を減算

    >> c1 = A + B
    c1 =
           4         7
          -1        6

    >> c2 = A - 1
    c2 =
           0         1
           2         3

●行列ABの乗算,行列ABの要素毎の乗算
 
乗算や除算では,要素毎の演算と行列の演算と行列の演算の2つがあり,前者は演算子の前にドット.を付け,後者は演算子のみで実行します.ここでは,行列ABに対し行列の乗算(*)と要素毎の乗算(*)を行います.

    >> c3 = A * B
    c3 =
           -5         9
            7        23

    >> c4 = A
* B
    c4 =
            3        10
         -12         8

 

3.4.2 初等数学関数とデータ解析関数

初等数学関数は,入力引数で指定した行列の各要素に対して一括して計算を行います.また,データ解析関数は,行列の各列に対して処理を行います.

●代表的な初等数学関数

sin

正弦

exp 

指数

log10

対数(10)

sqrt

平方根

round

最も近い整数へ丸め

●代表的なデータ解析関数

min

最小値

max

最大値

mean

平均値

std

標準偏差

sum

要素の和

●変数Xに対する正弦値の計算

長さの等しい2つの行ベクトルx1,x2を定義し(変数piは円周率が指定されている予約変数),縦に結合します.次に,作成した変数Xの各要素に対して正弦値(関数sin)を求めます.

    >> x1 = 0pi/4pi; x2 = 2*x1
    >> X = [x1
; x2]
    X =
            0          0.7854     1.5708     2.3562      3.1416
            0          1.5708     3.1416     4.7124      6.2832

    >> Y = sin (X)
    Y =
            0          0.7071     1.0000     0.7071      0.0000
            0          1.0000     0.0000   -1.0000     -0.0000
 

●4行4列の行列Xに対し各列の平均値及び標準偏差を求めます.
関数randn は,平均0で標準偏差1の正規分布から描かれる疑似数値を含む行列を返します.

    >> X = randn (4,4)
    X =
           0.6232     0.2120      1.0823     -0.6355
           0.7990     0.2379     -0.1315     -0.5596
           0.9409    -1.0078      0.3899      0.4437
          -0.9921    -0.7420     0.0880     -0.9499

    >> mx = mean (X)
    mx =
          0.3428     -0.3250     0.3572     -0.4253

    >> sx = std (X)
    sx =
          0.8993      0.6443      0.5286      0.6035


3.4.3
行列関数

行列関数を使うと線形代数演算を簡単に行えます.

inv

逆行列

lu

LU分解

det

行列式

qr

QR分解

rank

行列のランク

eig

固有値

線形代数で基本的な問題である連立方程式を取り上げます.下記の式を使います.

ここでは,ガウスの消去法による解法と逆行列による解法を行います.

●行列Aと行列bの定義

    >> A = [2 3 4 7]
    >> b = [5
9]

連立方程式を解く前段階として,桁落ちを調べるために行列のランク(関数rank)を,唯一解があるかどうかを調べるために行列式(関数det)を求めます.結果より,桁落ちが無く唯一解が存在することが確認できます.

●行列Aのランクと行列式の計算

    >> rA = rank (A)rd = det (A)
   rA = 2
   rd = 2

ガウスの消去法による解法は演算子で実現されます.また,関数invにより計算される逆行列を数式  に適用して解を求めることもできます.Inv(A)*bは,A\bとしてもよい.大規模なサイズの行列に対する演算では処理速度や計算精度の面で演算子で演算子¥の方が有効です.

●解xの計算

    >> x = inv(A)*b
    x  =
             4
            -1

    >> x = A\b
    x = 
             4
            -1


3.5 要素の比較

要素同士を比較する場合には比較演算子を使用します.また,要素を抽出したり置き換えたりする場合の条件判断にも比較演算子が役立ちます.この機能によってfor文による繰り返し計算を避けることができます.

比較演算子による実行結果は,0,1で構成されるロジカルデータとなります.つまり,要素が関係式を見たしていれば1(真)を,満たしていなければ 0(義)を出力します.

  A==B

 ABは等しい

  A~=B

 ABは等しくない

  A<B

 ABより小さい

  A<=B

 ABより小さいか等しい

  A>B

 ABより大きい

  A>=B

 ABより大きいか等しい


3.6 ファイルへの出力

ファイルへデータを出力する際はエクスポート関数を使います.ファイルフォーマットの種類に応じて下記のエクスポート関数があります.

 save

MAT-ファイルおよび,ブランク区切りのファイル

 d1mwrite

任意の区切り文字で区切られたファイル

 imwrite

画像ファイル

 wavwrite

Waveサウンドファイル

 avifile

AVIファイル

MAT-ファイルを使うと,Workspaceに定義された複数の変数を特別な編集をすることなしにそのままファイルへ出力することができます.また,インポートの際も loadコマンドで簡単に実行できるので,MATLAB環境でデータの入出力をする場合はMAT-ファイルが一番便利です.

MAT-ファイルへの保存は,次の書式で行います.

save ファイル名 変数名   もしくは, save (’ファイル名’,’変数名’)

変数ABMAT-ファイルtest1.mat に保存します.MAT-ファイルは,複数の変数を保存し,MATLAB固有の書式をもつバイナリファイルになります.

MAT-ファイルへの保存

    >> A = rand(15); B = rand1’;
    >> save test1 A B                          %
 下記でも可
    >> save (
test1’,’A’,’B’)

 


4. グラフ作成

4.1 2Dプロット

      関数 y=f(x) をプロットするためのMATLABの関数は,次のようなものがあります.

 plot

線形プロット

 semilogx

x軸対数プロット

 semilogy

y軸対数プロット

 loglog

両対数プロット


4.1.1
基本的なプロット

これらの関数の基本的な使い方は,どれも同じなのでplotを例として説明します.

関数plotは,関数y1=f(x1)を表示させたいとき,プロンプト上で

>> plot(x1,y1)

と入力し,実行します.複数の関数y1=f(x1)y2=f(x2)を同時に表示させたいとき,プロンプト上で

>> plot(x1,y1,x2,y2)

と入力し,実行します.3つ以上の場合も,同様に後ろに続けて記述します.

() 関数plot

>> x  = 0:0.1:6;
>> y1 = x+1;
>> y2 = (x-2).^2;
>> plot(x, y1,x, y2)

上の例を実行すると,上の図のようなウィンドウが現れます.2つのプロットの色は,自動的に,割り振られることがわかります.

      プロットのカラーラインタイプマーカタイプの3つのオプションを指定するには,

>> plot(x1,y1,’カラー ラインタイプ マーカー’,x2,y2,’カラー ラインタイプ マーカー’,...)

といった書き方をします. 各オプションは、文字データで指定します.例えば、カラーは、赤:r青:b緑:g など..., 

ラインは,実線: - 点線: など...,マーカーは,:o プラス: +などです.何も指定しない場合は,何も記述する必要がありません.

      これらのオプションを詳しく調べるには,

>>help plot

というように関数plotのヘルプを見ます.

() マーカーで表示

>> x  = 0:0.1:6;
>> y1 = x+1;
>> y2 = (x-2).^2;
>> plot(x, y1,'r-o',x, y2,'k+')

例の中の,'r-o' は,赤色の実線にマーク , 'k+' は,黒のマークで記すといった感じです.

      これらのオプションをうまく使用すれば,データの散布図を作ることができます.

() 散布図

>> data1 = randn(1000, 2) - 0.7;       %
正規分布に従う乱数
>> data2 = randn(1000, 2) + 0.7;      %1
列目がx座標データ,2列目がy座標データ    
>> plot(data1(:,1), data1(:,2), '.', data2(:,1), data2(:,2), 'r.');

4.1.2 対数軸プロット

      今まで,関数plotについて説明しましたが,関数plotsemilogxsemilogyloglogなどに置き換えれば,同様にこれらのプロットを使えます.

>> semilogx(x1,y1,’カラー ラインタイプ マーカー’,x2,y2,’カラー ラインタイプ マーカー’,...)

4.1.3 ヒストグラム

      ヒストグラムを作成するために関数histを使います.関数histは,

>>hist(Data, BinNum);

と実行します.Dataは対象となるデータ,BinNumはヒストグラムのビンの数を指定します.

() ヒストグラム

>> data1 = rand(100, 1) ;               %
一様分布に従う乱数
>> hist(data1)

>> data2(:, 1)=randn(500,1)+0.5;
   %正規分布に従う乱数
>> data2(:, 2)=randn(500,1)-0.5;
>>hist(data2,20);                          %
一つのグラフに表示
>>legend '
正規乱数1' '正規乱数2'

 


5. プログラミング機能

MATLABのプログラミング機能であるM-ファイルについて説明します.例題を用いながら,利点や仕様,動作原理について説明します.

5.1 プログラミングの基本

これまでの処理ではコマンド・関数をCommand Window上で個別に実行してきましたが,複数の処理をまとめて実行したい場合や,大規模な処理を段階的に構築したい場合があります.このような場合,プログラミング機能を活用することができます.プログラムは,拡張子:mのテキストファイル(M-ファイル)に書きます.M-ファイルは,テキストエディタを使って編集できます.MATLABはインタープリタなので,M-ファイルの実行時にコンパイルやリンクといった処理を行いません.

5.1.1.  エディタの起動方法

新規のM−ファイルを作成する場合は,editコマンドを実行し,エディタを起動します.

    >> edit


または,ファイル(F) 新規作成(N) M-file (I) を選択します.

以下のM-ファイル エディタが起動されます.

 

また,指定したM-ファイルをエディタで開くには,次の書式で実行します.

  >>  edit ファイル名

5.1.2. M-ファイルの保存

ファイル(F) -> 保存(S) または,別名で保存(A) を選択してファイル名を入力して保存.
ファイルを置き換える場合は,ファイル(F) -> 保存(S) を行う.

5.1.3. M-
ファイルの種類と特徴

M-ファイルは,その機能によって,スクリプトM−ファイルファンクションM-ファイルの2種類の形式に分けることができます.

機能の比較:

スクリプトM−ファイル

一連のコマンド・関数をまとめて処理することができる.

ファンクションM−ファイル

入力引数と出力引数を伴う,ユーザ定義の関数を作成することができる.

記述上の違い:

スクリプトM−ファイル

特別な記述は必要なし.実行したいステートメントを順に記述するだけ.

ファンクションM−ファイル

入出力の関係を記述したfunctionで始まる関数宣言の行が必要.

スクリプトM−ファイル,ファンクションM-ファイルともに,M-ファイル内で使われる変数は,ローカル変数と呼ばれ,M-ファイル内にのみ有効です.MATLABワークスペースの中の変数とは異なるものです.

はじめにスクリプトM−ファイルでプログラムを作成し,アルゴリズム検証が終わったらそれをファンクションM−ファイルにするという流れを探ると,デバッグを含めたトータルの作業効率が向上します.なお,MATLABのほとんどの関数はファンクションM−ファイルで提供されており,アルゴリズムの確認や編集を簡単に行うことができます.


5.2 スクリプトM−ファイル

5.2.1. スクリプトM-ファイル:sample1.mの例

<処理内容>
過去のUSAの人口数から未来の人口数を予測する.

    1

clear all 

% Workspace 変数をすべて削除

2

t = (1900:10:2000);

% Time interval を与える

3

p = [75.995 91.972 105.711 123.203 131.669 ...

% Populationを与える

4

      150.697 179.323 203.212 226.505 249.633 281.422];

 

5

plot (t, p, bo); 

% プロットする

6

axis ([1900 2020 0 400]);

% 軸の範囲を指定する

7

title (Population of the U.S. 1900-2000); 

% 図のタイトルをつける

8

xlabel (Year),  ylabel(Millions);

% 軸のラベルをつける

 

 

 

9

n = length(t);

 

10

s = (t-1950)/50;

 

11

A = zeros(n);   A(:,end) = 1;

% 行列Aの初期化

12

for j = n-1: -1 : 1

    A(: , j) = s .* A(: , j+1);

end

 

13

c = A(: , n-3 : n)\p

% 係数を計算

 

 

 

14

v = (1900:2020);

 

15

x = (v-1950)/50;

 

16

w = (2010-1950)/50;

 

17

y = polyval (c, x);

% 多項式の計算

18

z = polyval (c, w);

 

19

hold on;

% 図のプロットを保持する.

20

plot (v, y, k-);

% 予測曲線をプロットする.

21

plot (2010, z, ks);

% 予測点をプロットする.

22

plot (2010, z+15, num2str(z));

% 予測値をプロットする.

23

hold off;

% 図のプロットの保持を解除する.

 

 

5.2.2. スクリプトM−ファイルの実行 

スクリプトM−ファイルを実行するためには,Command Windowで単に拡張子(.m)なしでファイル名を入力するだけです.

●スクリプトM-ファイル:sample.mの実行

    >> sample1

実行すると上から順番に各行が処理され,2010年の予想人口数が表示されます.
なお,実行後のWorkspaceの変数を確認すると,スクリプトM-ファイルの中で処理された変数がすべて定義されているのがわかります.

Workspaceの確認

    >> whos 

    Name

Size

Bytes

Class

    A

11x11

968

double

    c

4x1

     32

double

    j

1x1

8

double

    n

1x1

8

double

    p

11x1

88

double

    s

11x1

88

double

(以下省略)

          実行結果の表示


5.3 ファンクションM-ファイル

     ファンクションは,入力引数をもち,出力引数を出力するM-ファイルです.M-ファイルの名前と関数の名前は同じものにします.ファンクションM-ファイルは,それ自身がもつワークスペースの中で変数を使い,MATLABコマンドプロンプトでアクセスするワークスペースと区別します.

   5.3.1 ファンクションM-ファイルの例

     M-ファイルrank.m の例を示します.(toolbox/matlab/matfun のディレクトリにあります.)
ファイルの内容は,次のコマンドで表示できます.

    >> type rank

      ファイルの内容:

    function r = rank (A, tol)

    %   RANK   Matrix rank.

    %   RANK(A) provides an estimate of the number of linearly

    %   independent rows or columns of a matrix A.

    %   RANK (A, tol) is the number of singular values of A

    %   that are larger than tol.

    %   RANK (A) uses the default tol = max (size(A)) * eps (norm (A)).

    %   

    %   Class support for input A:

    %        float :  double, single

 

    %   Copyright 1984-2004 The MathWorks, Inc.

    %   $Revision: 5.11.4.3 $  $Date: 2004/08/20 19:50:33  $

 

    s = svd (A);

    if nargin==1

        tol = max (size(A)) * eps (max(s));

    end

    r = sum (s > tol);

 

      ファンクション M-ファイルの最初の行は,function と言うキーワードで始まります.これは,関数名と引数の順序を与えるものです.この例では,入力引数は,2つで,出力引数は1です.

   最初のブランク行または実行可能行までの数行(% で始まる行)は,ヘルプテキストを与えるコメント行です.これらの行は,ユーザーが, help rank とタイプすることで,表示されます.ヘルプテキストの最初の行は,H1ラインと言われ,lookfor コマンドを使うか,または,ディレクトリ上のhelp によりMATLABが表示するものです.(ヘルプについては,後述の「6. オンラインヘルプ機能」を参照.)

   ファイルの残り(%で始まらない行)は,関数を定義している実行可能なMATLABコードです.最初の行の中の変数,r, A, tol と同様に関数の中に導入されている変数s は,すべての関数のローカル変数です.すなわち,MATLABワークスペースの中の変数とは異なるものです.

  5.3.2 ファンクションM-ファイルの実行

       MATLAB関数では,引数の数を可変にできます.これは,通常の他のプログラミング言語の中には見られない,MATLAB特有のものです.

   >> rank (A)

  

   >> r = rank (A)

 

   >> r = rank (A, 1.e-6)

    多くのM-ファイルは,この方法で実行します.出力引数を設定しなければ,結果はans にストアされます.2番目の入力引数が設定されなければ,関数はデフォルト値を使って計算します.関数の中で,nargin と nargout と名付けられた2つの量は,関数の中で特殊な使い方で,入力引数の数や出力引数の数を出力するものです.関数 rank は,nargin を使っていますが,nargout は使う必要がありません.


5.4 Matlabセッションのコマンドの保存

コマンドウインドウで,個別に実行した入力,結果は,基本的には,保存されません.繰り返し同じ処理を行ったり,複数の処理をまとめて実行する場合は,4.プログラミング機能で説明したように,M-ファイルに記述し,コマンドウインドウで,M-ファイルを入力して実行します.

コマンドウインドウで実行した結果を残したい場合は,コマンド diary  を使って,指定のファイルに書き出すことができます.

MATLABセッションのコマンドの保存は,diary filename で開始し,diary off で書き出しを停止します.

       
繰り返し実行する場合,filename のファイルがすでに存在する場合は,実行結果は,そのファイルに追加になり,上書きされません.     

以前の実行結果が不要なときは,filename のファイルを削除してから実行します.

以下の例は,kadaim_1.txt ファイルに,MATLABの関数 kadaim_1.m を実行させた結果を書き出しています.

  >> diary kadaim_1.txt
  >> kadaim_1

              (
 実行結果は省略 します )

 >> diary off

 


6.オンラインヘルプ機能

関数およびコマンドの使い方や,各種機能の使用方法等について情報が欲しいときにオンラインヘルプ機能を使うことができます.調べたい情報の内容によって,下記の5つの使用方法があります.

6.1 関数・コマンドの使い方を調べる場合

        helpコマンドを利用

         help 関数名  という形式で実行します.

 >> help eig
 eig は,固有値と固有ベクトルを計算します。 (以下,省略)

        docコマンドを利用

doc 関数名   という形式で実行します.
Help
プラウザが起動し詳細なヘルプが表示されます.

 >> doc eig

    

6.2 機能別の関数・コマンド一覧を調べる場合

helpwinコマンドを実行すると各ツールの機能別一覧がHelpプラウザに表示されます.

  >> helpwin

  

6.3 各機能の詳細を調べる場合

helpdeskコマンドを実行するとHelpウィンドウが起動します.コンテンツタブに表示されている項目を巡ることで個々の機能について調べることができます.

  >> helpdesk

    

6.4 機能別の検索キーワード一覧

help, helpwin コマンドに検索キーワードを指定することで,簡単に機能別の一覧を調べることができます.

検索したい機能が「基本行列と行列操作」の場合,検索キーワードは「elmat」を指定します.

  >> help
  >> help elmat

 以下は,機能別に対応している主な検索キーワードの一覧です.

general

一般的なコマンド

elmat

基本行列と行列操作

elfun

初等数学関係

matfun

行列関数−線形数値代数

detafun

データ解析とフーリェ変換

graph2d

2次元グラフ

graph3d

3次元グラフ

demos

例題とデモ

 

6.5 M-ファイルのキーワード検索

    ookforコマンドは,MATLABPATH (private ディレクトリを含む) 上に存在するすべてのM-ファイル内のHelp テキストの最初のコメント行 (H1 ) から文字列を検索します.一致したすべてのファイルに対して,lookfor H1行を表示します.

  >> lookfor rank

 

         検索した結果が表示されます.

  RANK     行列のランク

 SPRANK    構造的なランク

 RANKSUM     等しい中央値に対するウィルコクソンの順位和検定

 SIGNRANK     0 の中央値に関するウィルコクソン符号つき順位和検定

 TIEDRANK   同順位を調整をして,標本の順にを計算

 RANK     シンボリック行列のランク

  FRANK   Frank matrix.

  STARSREXACT     Compute exact tail probability for signed rank statistic.

 

 


7. 高度なグラフ作成

7.1 figure ウィンドウ

7.1.1 各部品の説明

      グラフを描画する関数を用いると,コマンドを入力する画面と,別のウィンドウが現れます.このグラフが描画されるウィンドウをfigureと呼びます.下の図を用いて,figureの各部品について説明します.

部品の名称

@figure 
Window
全体を指す.

AAxes
figure
内の軸とグラフの描画領域

Bメニュー
figure
編集のためのメニュー

Cコマンドボタン
figure
編集のためのコマンドボタン

E各軸のラベル

Fタイトル

G凡例

 

これらのプロパティを設定するにはコマンドプロンプト上で関数を実行するか,またはfigureの中にあるメニューやボタンを用いて行います.このページでは,主に,コマンドプロンプト上で関数を用いて,設定する方法を説明します. ちなみに,ボタンの上にマウスカーソルを置くと,ボタンの説明が出ますので,メニューやボタンでの設定は触ってみれば理解できると思います.

7.1.2  figureの表示・消し方

      まず,何もないfigureを作成してみましょう.新しいfigureを作成するには,

>> figure

と実行します.左上にある番号が,各figureを指定するための番号となります.

      複数のfigureウィンドウがあるときに,グラフを描画したいfigureウィンドウを選択するには,対象となるfigureをマウスでクリックするか,

コマンドプロンプト上で

>> figure(アクティブにしたいfigure番号)

と実行します. figureウィンドウを閉じるには,右上の×印を押すか,figureウィンドウをアクティブにした状態で

>> close

と実行します.全てのfigureウィンドウを閉じたいときは,

>> close all

と実行します.

7.1.3  座標軸(Axes)の複数作成

1つのfigure内に,複数の座標軸(Axes)を作成したいときは,関数subplotを使います.

Figurenm列に分割し、P番目の位置に座標軸を作成するには,

>> subplotn,m,P

と実行します.下の図は,subplotを用いた表示の例(n=2,m=1)です.

7.1.4 figureの保存

      作成したfigureは,figファイル(拡張子 fig に保存することができます.ただし,figファイルは,MATLAB固有の形式であるため,MATLABがインストールされているコンピュータしか開けることができません.

      figファイルで,figureを保存するには,メニューの中の「ファイル」->「保存」を選択して,ファイル名を指定すれば,保存できます.

      保存したfigファイルを開くには,メニューの中の「ファイル」->「開く」を選択して,figファイルを選択します.

7.1.5 画像ファイルへの出力

      figureは,figファイルとして保存するだけではなく,画像ファイルへ出力できます.画像ファイルへ出力すれば,MATLABがインストールされていなくても,画像表示ソフトがあれば,作成したグラフを閲覧できるので便利です.ただし,MATLABから,ファイルを開いたり,編集できないので注意する必要があります.

画像ファイルへ出力するには,「ファイル」->「エクスポート」を選択して,ファイルの種類とファイル名を指定します.


7.2 グラフの修飾

      プロットしたグラフにタイトルをつけたり,見やすくするための関数を紹介します.

7.2.1  タイトル

     タイトルを付け加えるには,関数titleを使います.

>> title('グラフのタイトル')

文字の大きさやフォントを指定するには,

>> title('グラフのタイトル', 'FontSize', 14, 'FontName', 'Times')

というように実行します.例では,文字の大きさを14ポイント,フォントをTimesと指定しています.

7.2.2  各軸のタイトル

      各軸にタイトルをつけるには,関数xlabelylabelzlabel を使用します.3つの関数の使い方は同じで,

>> xlabel('ラベル名')

というように使います.文字の大きさやフォントを指定するときは,関数titleと同様に

>> xlabel ('ラベル名', 'FontSize', 14, 'FontName', 'Times')

というように実行します.

7.2.3  凡例

      凡例を表示させたいときは,関数legend

>> legend('凡例1', '凡例2'....)

と実行します.また,表示した凡例を消したい場合は,

>> legend off

と実行します.

7.2.4  目盛り

グラフに目盛りを表示するには,関数grid

>> grid on

と実行します.また,表示した目盛りを消すには,

>> grid off

と実行します.

7.2.5  軸のスケール

各軸の表示範囲を変更するには,関数xlimylimzlimを使います.表示させたい範囲の最小値Xmin,最大値Xmaxとして

>> xlim( [Xmin, Xmax] );

と実行します.ちなみに,デフォルトでは自動的に範囲が決定されます.自動設定にしたいときは,

>> xlim( 'auto' );

とします.

7.2.6  軸のスケーリング

x軸、y軸、z軸で軸のデータ単位が等しくなるように、各軸の縦横比を設定するには,

>> axis equal

と実行します.また,カレントのaxesの領域を正方形にするには,

>> axis square

と実行します.基本的には,この2つの使い方を知っていれば良いのですが,他の設定もできます.

      ただ,単に実行するだけではなく,いろいろとパラメータを変更して確認すると,理解が深まると思います.

(グラフの修飾

>> x1 = -5:0.1:5;
>> y1 = x1+1;
>> y2 = (x1-2).^2;
>> plot(x1,y1,'b',x1,y2,'r')
>> title('2D PLOT','FontSize',18, 'FontName', 'Times')
>> xlim([-2,2])
>> ylim([-2,5])
>> xlabel('x','FontSize',18, 'FontName', 'Times')
>> ylabel('y','FontSize',18, 'FontName', 'Times')
>> grid on
>> legend('x+1','(x-2)^2')

7.2.7  配色(colormap)の設定

      プロットされた図の表面の配色などを,自由に変更することが可能です.配色を変更するには,関数colormapを使います.使い方は,

>>colormap 配色名

といった感じで実行します.例えば,白黒で表示するときは

>> colormap gray

とします.他には以下のような配色が用意されています.

autumn bone colorcube cool copper flag gray hot hsv jet pink prism spring summer white winterなど

      ちなみに,デフォルト(初期)の配色に戻すときは,

>> colormap default

とします.また,MATLABで用意された配色だけではなく,自分で配色を作ることも可能です.詳しくは,Helpブラウザを参照してください.


7.3 3Dプロット

2変数関数 z = f(x, y) をプロットする関数の説明をします.3Dプロットを行う関数として,

 plot3

3次元プロット

 surf

サーフプロット

 mesh

メッシュプロット

 surfc

サーフェースコンタープロット

などが用意されています.

7.3.1 基本的なプロット

基本的なプロットとして,2Dプロットの関数plotを,3Dプロットに拡張した関数plot3があります.

関数plot3は,z軸用のデータを一つ加えて

>>plot3(x1,y1,z1,’カラー ラインタイプ マーカー’,x2,y2,z2,’カラー ラインタイプ マーカー’,...)

という形式で実行します.オプション部分は,関数plotと同じです.

       また,関数meshsurfは,

>> mesh(X,Y,Z);

と実行します.XYZはそれぞれの座標データです.関数surfも関数の名前を置き換えて実行すれば,プロットできます.

      これらのグラフがどのように表示されるのかを比較します.matlabには,XYZ座標を作成してくれるテスト用の関数peaksがありますので,これを使います.関数peaksは,

>> [X,Y,Z]=peaks;

と実行すると,x座標,y座標,z座標のデータを出力します.

次の例は,関数peaksから出力されたデータを使って,各3次元プロットを表示する例です.3Dプロットは,右上の3-D回転のボタンを使うことにより,様々な角度からグラフを見ることができます.

() 3次元プロット

>> [X,Y,Z]=peaks;
>> figure(1)
>> plot3(X,Y,Z)
>> title('(a) plot3(X,Y,Z)')
>> figure(2)
>> title('(b) mesh(X,Y,Z)')
>> mesh(X,Y,Z)
>> figure(3)
>> surf(X,Y,Z)
>> title('(c) surf(X,Y,Z)')
>> figure(4)
>> surfc(X,Y,Z)
>> title('(d) surfc(X,Y,Z)')

 

 

7.3.2 等高線プロット

      2変数関数 z = f(x, y) を等高線プロットを描画するための関数は,contourcontourfcontour3などがあります.

関数contourは,X, Y, Zをそれぞれの座標データ,Numを等高線の数として

>> contour(X,Y,Z,Num);

と実行します.contourfcontour3も同様に記述すれば使用できます.

(等高線プロット

>> [X Y Z]=peaks;
>> figure
>> subplot(1,2,1)
>> contour(X,Y,Z,20)
>> title('(a) contour(X,Y,Z)')
>> subplot(1,2,2)
>> contourf(X,Y,Z,20)
>> title('(b) contourf(X,Y,Z)')

関数clabelで,標高ラベルを表示したり, 関数colorbarで,各色と値の対応を見るためのカラーバーを表示することが可能です.

関数clabelを使うときには,次の例のように関数contourf(または,contour)を使用するときに,出力用の変数を指定し,

その変数を用いて,関数clabelを実行します.

(標高ラベルとカラーバーの表示

>> [X Y Z]=peaks;
>> [c,h]=contourf(X,Y,Z,5);
>> clabel(c,h);
>> colormap pink
>> colorbar

      ※例の関数colormapの説明は,コチラです. 

 

7.3.3 座標データの作成

      テスト関数ではなく,自分で定義した2変数関数 z = f(x, y)  を表示する方法を説明します.

初めに,x座標とy座標のデータを作成する必要があります.x座標とy座標のデータを作るには,関数meshgridを使います.

     関数meshgridは,

>>[X, Y] = meshgrid(x座標データ,y座標データ);

と実行すると,3次元プロットで用いるためのx座標データはXに,3次元プロットで用いるためのy座標データはYに格納されます.

      次の例では,x座標の範囲[0, 3], y座標の範囲[4, 6]で,3次元プロット用の座標データの作り,作成したx y座標のデータから,関数z=x^2+y^2のz座標のデータを作っています.

(関数meshgridの使用例

>> x=0:3    
           % x座標のデータ

x =

0  1  2  3

>> y=4:6
             % y座標のデータ

y =

4  5  6

>> [X Y] = meshgrid(x,y)
    % 3次元プロット用のx,y座標のデータ 

X =

0  1  2  3
0  1  2  3
0  1  2  3


Y =

4  4  4  4
5  5  5  5
6  6  6  6

>> Z=X.^2+Y.^2         %関数z=f(x,y)のデータ

Z =

16 17 20 25
25 26 29 34
36 37 40 45

>> surf(X,Y,Z);                   %グラフのプロット

これで,surfmeshなどの3Dプロットに使用する x, y, z座標データができました.関数meshgridの動作を考えればわかるのですが,3Dプロットのデータを作成するためにしか使えないわけではありません.いろいろと使える関数なので,しっかりと動作を確認しておくと,役に立ちます.


課 題

課題M-(行列演算)

次の行列を定義し,問題 1)6) の結果を出すMATLABのコマンドを記述したものをM-ファイルとして作成してください.

 

1) 行列ABCDIPQRS を定義しなさい.ただし,行列DI は,Matlabの関数を使って定義しなさい.
2) A+BA+2BB-DA+B+D+I を計算してください.
3) ABBADIPQR2(要素の2乗)を計算してください.
4) A+ATCTBRTSTQR(QR)TS を計算してください.Tは,転置を表します.
5) 行列Pの逆行列を求め,それを行列Uと置きます.P*U = I かつ U*P = I になることを確認しなさい.
6) 行列PおよびQの行列式を求めなさい.

 


課題M-(連立方程式の解法)

次のシステムを行列演算を使って解いてください.ただし,行列の桁落ちを調べるため,行列の階級(ランク)を,また,唯一解があるかどうかを調べるため,先に行列式を求めなさい.MATLABコマンドの記述は,M-ファイルとして作成すること.

1)                      2)                    3)


課題M-3 (多変量統計データの解析)

MATLAB は,多変量統計データに対して,列方向の解析を行います.データ中の各々の列は,1つの変数を表し,行は観測値です.(ij番目の要素は,j 番目の変数の i 番目の観測値です.

変数に,身長,体重,標準体重,肥満度を持つデータを作成し,各列の統計データを解析してみよう.
身長は,165167178174174180 を第1列目に,体重は,607268606264 を第2列目に直接入力します.標準体重,肥満度は,下記の計算式から算出して,第3,4列目にそれぞれ代入します.

       標準体重 = ( 身長 - 100 ) * 0.9  
       肥満度 = ( 体重 − 標準体重 )/ 標準体重 * 100  

作成した6行4列のデータに対して,各列の平均,標準偏差,中央値(Median),最大値,最小値を計算しなさい.

この課題では,多変量統計データの作成から,各列の統計値を算出するまでのプロセスを,M-ファイルとして作成すること.

多変量データの作成例:

  >> D
 
 D =

 165.0000    60.0000   58.5000     2.5641
 167.0000    72.0000   60.3000   19.4030
 178.0000    68.0000   70.2000   -3.1339
 174.0000    60.0000   66.6000   -9.9099
 174.0000    62.0000   66.6000   -6.9069
 180.0000    64.0000   72.0000  -11.11

 >> mean(D)

 ans =

 173.0000    64.3333   65.7000   -1.5158

 


 課題M-4  (グラフの作成)

関数 f(x)=(x+1)(x-2)(x+3) とその導関数 f '(x) をプロットする.ただし,

 ・1つの座標軸に表示する.

 ・x軸,y軸のラベル(xlabel,ylabel),グラフにタイトル(title)をつける.

 ・凡例(legend)をつける.

 ・導関数のプロットは,実線以外で表示する.

を必ず行ってください.見本は,コチラです.結果は,ビットマップ(.bmp)形式に保存すること.

 


課題M-5 2次元グラフの作成)

2次元正規分布 f(x,y) = exp(-(x^2 + y^2)/2)/(2*pi) を,関数surfcontourf を使って表示する.ただし,

 ・1つのfigureで表示する.(subplotを使用する.)

 ・x軸,y軸,z軸のタイトル(xlabel, ylabel, zlabel)と,各グラフにタイトル(title)をつける.

 ・配色は,デフォルトの配色(colormap)以外のものを使う.

 ・contourfプロットには,カラーバー(colorbar)をつける.

を必ず行ってください.見本は,コチラです.ビットマップ(.bmp)形式に保存すること.



参考文献

  1. 小林一行,“最新MTALABハンドブック”,秀和システム,第3版版(2008/08
  2. 青山貴伸,森口 肇,蔵本一峰 著,“最新使える!MATLAB”,講談社,(2006/02)
  3. 上坂吉則,“MATLABプログラミング入門”,牧野書店,(2000/12
  4. 芦野隆一,Rémi Vaillancourt 著,“はやわかりMATLAB”,共立出版,(1997/07)

MATLAB関連のホームページに         

 ・ サイバネットシステム株式会社 http://www.cybernet.co.jp/matlab/support/technote/index.shtml

があります.


1版作成 : 2003. 7
1版改訂 : 2004. 7
2版改訂 : 2009. 4