イントロダクション graphics...

62
イントロダクション MATLABとは ? MATLABは、技術計算のための高性能言語です。これは、問題や解法を良く馴染んだ数学 的な記法で表現する使い易い環境で、計算、可視化、プログラミング機能を統合してい ます。つぎのような機能を含んでいます。 数学と計算 アルゴリズムの開発 モデル化、シミュレ-ション、プロトタイピング デ-タ解析、式、可視化 科学的、工学的なグラフィックス グラフィカルユ-ザインタフェ-ス構築を含んだアプリケ-ションの開発 MATLABは、次元の宣言を必要としなく、基本的なデ-タ要素が配列である対話形式のシ ステムです。これは、多くの技術計算問題、特に行列やベクトルで定式化した問題を解 きます。また、 CFortranのようなスカラ非対話型言語でプログラムを書くのと比べて、 時間的に短縮できます。 MATLABと言う名前は、matrix laboratoryの略です。MATLABは、元々、LINPACK,EISPACK プロジェクトで開発された行列計算ソフトウエアに簡単にアクセスできるように書かれ たものです。このプロジェクトは、行列計算に対して、最先端の技術をソフトウエアに 取込んだものです。 MATLABは、多くのユ-ザからの意見を長年に渡って取込んでいます。大学において、数 学、工学、科学のコ-スで初級から上級まで標準的なツ-ルになっています。産業界に おいて、 MATLABは、生産性の高いリサ-チ、開発、解析のためのツ-ルになっています。 MATLABは、アプリケ-ションに特化したToolboxと呼ばれるファミリを構成しています。 多くのMATLABユ-ザにとって大切なことは、 Toolboxにより特殊な技法を学び適用する ことです。 Toolboxは、 MATLABの環境下で特別なクラスの問題を解くためにMATLABを拡張 するMATLAB関数(M-ファイル)の集めたものです。 Toolboxが利用可能な分野として、信号 処理、制御システム、ニュ-ラルネットワ-ク、ファジィ論理、ウェ-ブレット、シミ

Upload: phungque

Post on 28-May-2018

224 views

Category:

Documents


0 download

TRANSCRIPT

イントロダクション

MATLABとは ?

MATLABは、技術計算のための高性能言語です。これは、問題や解法を良く馴染んだ数学

的な記法で表現する使い易い環境で、計算、可視化、プログラミング機能を統合してい

ます。つぎのような機能を含んでいます。

数学と計算

アルゴリズムの開発

モデル化、シミュレ-ション、プロトタイピング

デ-タ解析、式、可視化

科学的、工学的なグラフィックス

グラフィカルユ-ザインタフェ-ス構築を含んだアプリケ-ションの開発

MATLABは、次元の宣言を必要としなく、基本的なデ-タ要素が配列である対話形式のシ

ステムです。これは、多くの技術計算問題、特に行列やベクトルで定式化した問題を解

きます。また、CやFortranのようなスカラ非対話型言語でプログラムを書くのと比べて、

時間的に短縮できます。

MATLABと言う名前は、matrix laboratoryの略です。MATLABは、元々、LINPACK,EISPACK

プロジェクトで開発された行列計算ソフトウエアに簡単にアクセスできるように書かれ

たものです。このプロジェクトは、行列計算に対して、最先端の技術をソフトウエアに

取込んだものです。

MATLABは、多くのユ-ザからの意見を長年に渡って取込んでいます。大学において、数

学、工学、科学のコ-スで初級から上級まで標準的なツ-ルになっています。産業界に

おいて、MATLABは、生産性の高いリサ-チ、開発、解析のためのツ-ルになっています。

MATLABは、アプリケ-ションに特化したToolboxと呼ばれるファミリを構成しています。

多くのMATLABユ-ザにとって大切なことは、Toolboxにより特殊な技法を学び、適用する

ことです。Toolboxは、MATLABの環境下で特別なクラスの問題を解くためにMATLABを拡張

するMATLAB関数(M-ファイル)の集めたものです。Toolboxが利用可能な分野として、信号

処理、制御システム、ニュ-ラルネットワ-ク、ファジィ論理、ウェ-ブレット、シミ

ュレ-ション等多くのものを含んでいます。

MATLABシステム

MATLABシステムは、主に、つぎの5つの部分から構成されています。

MATLAB言語

これは、コントロ-ルフロ-ステ-トメント、関数、デ-タ構造、入/出力、オブジェク

ト指向のプログラミング機能をもった高水準の行列/配列言語です。すぐに作成できる"

小規模なプログラミング"と大きな、そして複雑なアプリケ-ションプログラムを作成す

る"大規模なプログラミング機能"をもっています。

MATLAB作業環境

これは、MATLABユ-ザとしても、MATLABプログラマとしても使える機能をもったツ-ル

です。MATLABは、ユ-ザのワ-クスペ-スの中の変数を管理し、デ-タを読み込んだり、

書き出したりする機能をもっています。そして、MATLABは、MATLABアプリケ-ションを

開発したり、管理したり、デバッグしたり、M-ファイルのプロファイリングをしたりす

る機能をもっています。

Handle Graphics

これは、MATLABのグラフィックスシステムです。これは、2次元、3次元のデータの可視

化、イメージ処理、アニメーション、プレゼンテーション用のグラフィックスに対する

高水準のコマンドを用意しています。また、ユ-ザが十分にカスタマイズできるグラフ

ィックスやMATLABアプリケ-ションに対して使用できるGraphical User Interfaceを作

成することができる低水準のコマンドをもっています。

MATLABの数学関数ライブラリ

これは、和、正弦値、余弦値、複素数代数のような基本的な関数から逆行列、行列の固

有値、Bessel関数、高速フ-リェ変換のような複雑な関数まで幅広い範囲に渡る計算ア

ルゴリズムを集めたものです。

MATLABアプリケ-ションプログラムインタフェ-ス

これは、MATLABとインタフェースを取れるCやFortranプログラムを記述できるライブラ

リです。MATLABから読み込むルーチン用の機能(ダイナミックリンク)、計算エンジンと

してMATLABを読み込んだり、MAT-ファイルを読み込んだり、MAT-ファイルに書き込んだ

りする機能を含みます。

Simulinkについて

Simulinkは、MATLABを使ったプログラムで、非線形ダイナミックシステムをシミュレー

ションするための対話形式のシステムです。これは、スクリーン上に ブロック線図を描

くことでシステムをモデル化し、それをダイナミカルに取り扱います。また、Simulink

は、線形、非線形、連続系、離散系、多変数系、マルチレ-トシステムを取扱えます。

Blocksetsは、通信、信号処理、パワ-システムのような特殊なアプリケ-ションに対す

るブロックの補助的なSimulinkライブラリです。

Real-time Workshopは、ユ-ザのブロック線図からCコ-ドを作成するプログラムです。

そして、種々の実時間システム上で実行します。

MATLABの起動

この本は、MATLABを学び始める人々の助けになるように考えて作られています。そのた

め、いくつかの例題を含んでいて、MATLABを起動して、実行しながら進めてください。

PCやMacintoshでMATLABを起動するには、MATLABアイコンをダブルクリックしてください。

UNIXシステムでMATLABを起動するには、オペレ-テングシステムのプロンプト上で、

matlabとタイプインしてください。MATLABを終了するには、MATLABプロンプト上でquit

とタイプインしてください。

仮に、手助けが欲しい場合は、MATLABプロンプト上でhelpとタイプインするか、PC、Mac

の場合は、Helpメニュ-をプルダウンしてください。これにより、ユ-ザは、ヘルプか

ら、より多くの情報を得られます。後の章で、ヘルプ機能やオンラインドキュメント機

能について、さらに説明しています。

行列と魔方陣

MATLABを取り扱い始める最良の方法は、行列の取扱いを学ぶことです。この節は、どの

ようにそれを行なうかを示すものです。MATLABにおいて、行列は、数字を使った長方形

の配列です。特別なものは、1行1列の行列、すなわちスカラと1行または1列の行列、す

なわちベクトルです。MATLABは、数値デ-タまたは数値デ-タでないものも共にストア

できます。しかし、学び始めるにあたり、すべてのものを行列と考えることが最良だと

思います。MATLABの中の演算は、できるだけ自然であるように作られています。他のプ

ログラミング言語が、一度に数値一つに機能しますが、MATLABは迅速、かつ簡単に行列

全体に働きます。

この本を通して使われている良い例題としての行列は、ドイツの芸術家でアマチュアの

数学者であるAlbrecht Dürerによるルネッサンスの彫刻家のMelancholian に現われてい

るものです。このイメ-ジは、数学的なシンボルで満たされています。そして、注意深

く見ると、上の右隅に行列が見えます。この行列は、魔方陣として知られているもので、

Dürerの時代に本当に魔法的な性質をもっていると多くの人に信じられていたものです。

これは、表現するのに値するいくつかの素晴らしい機能をもっています。

行列の入力

MATLABに行列を定義する方法は、たくさんあります。

要素毎に明示的に入力

外部デ-タファイルから行列をロ-ド

組込み関数を使って行列を作成

M-ファイルの中で、ユーザ自身の関数を使って行列を作成

Dürerの行列を要素ごとに入力することから始めましょう。ユ-ザが、これを行なうには、

2,3の基本的な規則に従うだけです。

ブランク、またはコンマを使って、行の要素を分離

セミコロン;を使って、行の終わりを設定

要素全体を鍵括弧 [ ]で囲む

Dürer行列を入力するためには、単につぎのようにタイプしてください。

A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]

MATLABは、入力された行列をつぎのように表現します。

A =

16 3 2 13

5 10 11 8

9 6 7 12

4 15 14 1

これは、彫刻の中の数字と一致しています。行列を一度入力すると、MATLABのワ-クス

ペ-スに自動的に記憶されます。ユ-ザは、その行列を単にAとして参照できます。さて、

ワークスペ-ス内にAを定義したので、それを興味深く調べてみましょう。なぜ、それは

魔法なのですか?

和、転置、対角

魔方陣行列の特別な性質、すなわち、各要素の種々の和に関連していることは、多分知

っているでしょう。行または列に沿って、または二つの主対角に沿って和を計算すると、

同じ数字(結果)を得るでしょう。MATLABを使って確かめて見ましょう。まず、つぎのス

テートメントを試します。

sum(A)

MATLABは、つぎの結果を表示します。

ans =

34 34 34 34

出力引数を設定しないと、MATLABは変数ansを出力引数として自動的に割当てます。これ

は、answerを略したもので、計算結果を保存するものです。これにより、Aの各列の和を

要素とする行ベクトルを計算すると、列の各々の要素はすべて同じ、すなわち魔方陣の和

は34です。

行に関する和はどうなりますか?MATLABは、行列の列に関しての処理を優先します。そ

れで、行の和を得る最も簡単な方法は、行列を転置し、転置された列の和を計算し、そ

の結果を再度転置することです。転置演算は、アポストロフまたはシングルコ-ティシ

ョン'により定義されています。これは、主対角に対して行列を入れ替え、そして、行ベ

クトルを列ベクトルにします。それで、

A'

は、転置行列を作成します。

ans =

16 5 9 4

3 10 6 15

2 11 7 14

13 8 12 1

そして、

sum(A')'

は、行方向の和を含んだ列ベクトル

ans =

34

34

34

34

を出力します。主対角要素の和は、diag関数を使って、簡単に得られます。まず、対角

要素のみを抜出します。

diag(A)

により、つぎの結果を出力します。

ans =

16

10

7

1

そして、

sum(diag(A))

は、つぎの結果を出力します。

ans =

34

他の対角部、すなわち逆対角は、数学的にはあまり重要ではありません。それで、MATLAB

は、それに対応するような関数を準備していません。しかし、グラフィックスの中で使

われる関数fliplrは、行列の左と右の順番を逆にします。

sum(diag(fliplr(A)))

ans =

34

これで、Dürerの彫刻の中の行列は、本当に魔方陣であることが確認されました。そして、

この過程には、2,3のMATLABの行列演算をサンプルとして示しています。つぎの節では、

他のMATLAB機能を示すために、この行列を使います。

サブスクリプト

Aのi番目の行、j番目の列の要素をA(i,j)と定義します。たとえば、A(4,2)は、4番目の

行の2番目の列の数字です。この例題で使っている魔方陣では、A(4,2)は15です。Aの4

番目の列の要素の和は、つぎのようにタイプすることで求まります。

A(1,4) + A(2,4) + A(3,4) + A(4,4)

これにより、

ans =

34

が求まります。しかし、単一の列の和を計算する方法では、最も洗練されていない方法

です。

これは、単一のサブスクリプトをもつ行列要素と考えることもできます。たとえば、A(k)

です。これは、行ベクトルと列ベクトルを参照する通常の方法です。しかし、2次元の行

列にも適用することができます。この場合、もとの行列を列方向に分解して作られる一

つの長い列ベクトルとしての配列と考えます。それを使って、例題で使っている魔方陣

において、A(8)は、A(4,2)にストアされている値15と考えることもできます。

行列で定義されている要素以外のものを使おうとすると、エラ-が生じます。

t = A(4,5)

Index exceeds matrix dimensions.

一方、行列で定義されている要素以外の要素に値をストアしようとすると、新しい要素

を行列に付加えてサイズが大きくなります。

X = A;

X(4,5) = 17

X =

16 3 2 13 0

5 10 11 8 0

9 6 7 12 0

4 15 14 1 17

コロン演算子

コロン記号:は、MATLABの重要な演算子の一つです。これは、種々の異なる型で使われま

す。つぎの表現

1:10

は、1から10までの整数を含む行ベクトルを作成します。

1 2 3 4 5 6 7 8 9 10

単位間隔でないものを得るには、間隔を示す量を設定します。たとえば、

100:-7:50

は、つぎの結果を出力し、

100 93 86 79 72 65 58 51

そして、

0:pi/4:pi

は、つぎの結果を出力します。

0 0.7854 1.5708 2.3562 3.1416

コロン記号を含んだサブスクリプト表現は、行列のある一部を表現します。

A(1:k,j)

は、Aのj番目の列の最初からk番目までの要素に対応します。それで、

sum(A(1:4,4))

は、4番目の列の和を計算することになります。しかし、これには、さらに良い方法があ

ります。コロン自身は、行列の行または列の中の全部の要素を意味しています。そして、

キ-ワ-ドendは、行または列の最後を意味します。それで、

sum(A(:,end))

は、Aの最後の列の要素の和を計算します。答えは、

ans =

34

になります。なぜ、4行4列の正方形に対して、魔方陣の和は34なのですか。1から16まで

の整数は、和が等しくなるように4つのグル-プに分類されたとすると、その和は、

sum(1:16)/4

にならなければなりません。それでもちろん

ans =

34

となるのです。

Symbolic Math Toolboxを使っている場合、n行n列の魔方陣の和は、(n3 + n)/2であ

ることがわかります。

関数magic

MATLABは、任意の大きさの魔方陣を作る組込み関数を用意しています。この関数がmagic

ですが、別に驚くことではありません。

B = magic(4)

B =

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

この行列は、Dürerの彫刻の中のものとほぼ同じで、同様な魔方陣の性質をもっています。

ただし、中央の列が入れ替わっていることが異なります。このBを DürerのAにするため、

中央の2つの列を入れ替えましょう。

A = B(:,[1 3 2 4])

これは、行列Bの行のそれぞれに対して、要素の順番を1,3,2,4の順に並べ替えます。つ

ぎの結果を得ます。

A =

16 3 2 13

5 10 11 8

9 6 7 12

4 15 14 1

Dürerは、MATLABの順序を使うことができたときに、なぜ列を並び替えるような面倒さを

生じさせたのでしょうか? これは、彼の魔方陣の下の部分で彫刻を作成した年代1514を

記述したかったことは疑う余地もありません。

式表現

他の大部分のプログラミング言語と同様に、MATLABは、数学的な式を使いますが、他の

プログラム言語と異なり、これらの式はすべての行列を含んでいます。式は、つぎのも

のから構成されています。

変数

数字

演算子

関数

変数

MATLABは、タイプの宣言や次元を宣言するステ-トメントを必要としていません。MATLAB

は新しい変数名を使おうとするとき、自動的に変数を作成し、適切な大きさのストレ-

ジを割当てます。変数がすでに存在していると、MATLABは必要なら、その内容を変更し、

新しいストレ-ジを割当てます。たとえば、

num_students = 25

は、1行1列のnum_studentsと名付けた行列を作成し、その単一要素に値25をストアしま

す。

変数名は、一つの文字を先頭に、その後にいくつかの文字、数字やアンダ-スコアを続

けて表わされます。MATLABは、1つの変数名として、最初の31文字のみを使います。MATLAB

は、大文字、小文字の区別を行ないます。すなわち、Aとaは、同じ変数ではありません。

ある変数に割当てられた行列を表示するには、単に変数名を入力してください。

数字

MATLABは、通常の小数点表示を行ないます。これは、小数点をもち、数字の先頭にプラ

スまたはマイナスの符号を付けます。科学的な記法として、10のベき乗のスケ-ルファ

クタを設定するeを使います。虚数は、iまたはjをサフィックスとして使います。正しく

表現された数字の例を示します。

3 -99 0.0001

9.6397238 1.60210e-20 6.02252e23

1i -3.14159j 3e5i

すべての数字は、IEEE浮動小数点標準で設定されるlong書式を使って内部的にはストア

されます。浮動小数点数は、だいたい16桁の数字の有限精度をもち、10-308から10+308の有

限な範囲に入ります(VAXコンピュ-タは、異なる浮動小数点書式をもっています。しか

し、その精度とレンジは、ほぼ同じです)。

演算子

式には、馴染みの深い代数演算子と優先順位則を使います。

+ 加算

- 減算

* 乗算

/ 除算

¥ 左除算

(Using MATLABの"行列と線形代数"の節を参照)

^ ベキ乗

' 複素共役転置

( ) 演算順序の変更

関数

MATLABは、abs, sqrt, exp, sin等を含む多くの標準的な初等数学関数を用意しています。

負の数の平方根や対数は、エラ-にはなりません。適切な複素数で表される結果が自動

的に出力されます。MATLABは、Bessel関数やGamma関数を含んだ、よりアドバンスドな数

学関数も用意しています。これらの関数のほとんどは、複素数と共にも使えます。初等

数学関数の一覧を得るには、

help elfun

そして、よりアドバンスドな数学関数や行列関数の一覧を得るのは、

help specfun

help elmat

とタイプインしてください。たとえば、sqrt,sin等のいくつかの関数は組込み関数にな

っています。これらは、MATLABのコアの一部で、非常に効率よく作られていますが、計

算の詳細を見ることはできません。gamma,sinh等の他の関数は、M-ファイルとして実行

されます。これらは、ユ-ザが内容を見ることができ、必要なら、内容を変更すること

ができます。

いくつかの特別な関数は、利用可能な定数値を用意しています。

pi 3.14159265

i 虚数単位, -1

j iと同じ

eps 浮動小数点相対精度, 2-52

realmin 最も小さな浮動小数点数, 2-1022

realmax 最も大きな浮動小数点数, (2- )21023

Inf 無限大

NaN Not-a-number

無限大は、ゼロでない数をゼロで割ること、または、オ-バフロ-を巧く定義する数学

的表現、すなわちrealmaxを超える数を定義する表現として使います。Not-a-Numberは、

0/0またはInf-Infのような巧く定義できない数学的な値を計算するときに作成されます。

関数名はリザ-ブされません。たとえば、

eps = 1.e-6

のような新しい変数を定義すると、これらは書き替えられます。そして、その値は、そ

の後の計算で使われます。もともとデフォルトとして定義されている関数は、

clear eps

を使うことにより、デフォルト値に戻ります。

方程式

MATLABの式のいくつかの例をすでに見てきました。ここでも、いくつかの例とその結果

を示します。

rho = (1+sqrt(5))/2

rho =

1.6180

a = abs(3+4i)

a =

5

z = sqrt(besselk(4/3,rho-i))

z =

0.3730+ 0.3214i

huge = exp(log(realmax))

huge =

1.7977e+308

toobig = pi*huge

toobig =

Inf

行列の作成

この節は、今までに紹介していない行列の作成方法を示します。

行列の作成

MATLABは、基本的な行列を作成する4つの関数を用意しています。

zeros 要素がすべてゼロの行

ones 要素がすべて1の行列

rand 一様分布する要素から

なる行列

randn 正規分布する要素から

なる行列

いくつかの例題を示します。

Z = zeros(2,4)

Z =

0 0 0 0

0 0 0 0

F = 5*ones(3,3)

F =

5 5 5

5 5 5

5 5 5

N = fix(10*rand(1,10))

N =

4 9 4 4 8 5 2 6 8 0

R = randn(4,4)

R =

1.0668 0.2944 -0.6918 -1.4410

0.0593 -1.3362 0.8580 0.5711

-0.0956 0.7143 1.2540 -0.3999

-0.8323 1.6236 -1.5937 0.6900

ロード

loadコマンドは、前もってMATLABで作成された行列を含むバイナリファイルを読み込ん

だり、または数値デ-タを含むテキストファイルを読み込んだりします。テキストファ

イルは、各行の要素の数は等しく、ライン毎に1行のデ-タをもち、各要素はブランクで

区切られた数値から構成される長方形のテ-ブルとして作成されたものです。たとえば、

MATLABから離れ、つぎの4つのラインを含むテキストファイルを作成します。

16.0 3.0 2.0 13.0

5.0 10.0 11.0 8.0

9.0 6.0 7.0 12.0

4.0 15.0 14.0 1.0

このデ-タをmagik.datと言うファイルに保存します。そして、つぎのコマンドを使って、

ファイルを読み込み、例題の行列を含む変数magikを作成します。

load magik.dat

M-ファイル

ユ-ザ自身の行列は、M-ファイルを使って作成できます。このM-ファイルとは、MATLAB

コ-ドを含んだテキストファイルです。すなわち、ユ-ザがMATLABコマンドラインでタ

イプするものと同じステ-トメントを含んだファイルです。拡張子.mを付けてファイル

を保存してください。

注意:

PCやMac上でテキストエディタをアクセスする場合、Fileメニュ-からOpenまたはNewを

選択するか、ツ-ルバ-の対応するボタンを押してください。UNIX上でテキストエディ

タをアクセスする場合、!印を使い、その後、ユ-ザのオペレ-ティングシステムプロン

プトでユ-ザが通常使っているコマンドを続けてください。

たとえば、つぎの5つのラインを含むファイルを作成します。

A = [ ...

16.0 3.0 2.0 13.0

5.0 10.0 11.0 8.0

9.0 6.0 7.0 12.0

4.0 15.0 14.0 1.0 ];

これをmagik.mと名付けてファイルに保存します。

magik

のステ-トメントを使って、ファイルを読み、例題の行列を含む変数Aを作成します。

連結

連結は、小さな行列を合わせてより大きな行列にする作業です。実際に、最初の行列は、

個々の要素を連結して作ったものです。[]記号は、連結を行なう演算子です。たとえば、

4行4列の魔方陣Aを使って、つぎの型を作成します。

B = [A A+32; A+48 A+16]

結果は、4つの小行列を連結した8行8列の行列になります。

B =

16 3 2 13 48 35 34 45

5 10 11 8 37 42 43 40

9 6 7 12 41 38 39 44

4 15 14 1 36 47 46 33

64 51 50 61 32 19 18 29

53 58 59 56 21 26 27 24

57 54 55 60 25 22 23 28

52 63 62 49 20 31 30 17

この行列は、別の魔方陣を作成する方法の途中結果になっています。この要素は、整数

1:64を並び替えたもので、その列の和は、8行8列の魔方陣行列の各列の和と等しいもの

になります。

sum(B)

ans =

260 260 260 260 260 260 260 260

しかし、その行の和sum(B')'は、すべて同じものにはなりません。正しい8行8列の魔方

陣を作成するには、さらに操作が必要です。

行と列の削除

[,]記号を使って、行列から行や列を削除することができます。まず、行列を設定します。

X = A;

そして、Xの2番目の列を削除するため、つぎのように行ないます。

X(:,2) = []

Xは、つぎのようになります。

X =

16 2 13

5 11 8

9 7 12

4 14 1

行列から単一要素を削除したい場合、結果はもはや行列になりません。すなわち、つぎ

のような表現

X(1,2) = []

は、エラ-になります。しかし、単一サブスクリプトを使って、単一要素または連続し

ている要素群を削除して、残りの要素を行ベクトルとして表現することはできます。

X(2:2:10) = []

結果は、つぎのようになります。

X =

16 9 2 7 13 12 1

コマンドウインドウ

さて、MATLABのコマンドラインを使い、コマンドや式をタイプしたり、コマンドウイン

ドウにプリントされる結果を調べてみましょう。この節は、コマンドウインドでの種々

の表現法について記述します。ユ-ザが使っているシステムで、コマンドウインドウの

フォントやタイプ型を選択できるなら、適当な間隔を設定するFixedsysやCourierのよう

な固定された幅のフォントを使うことをお薦めします。

コマンドformat

コマンドformatは、MATLABにより表示される数値の書式を制御するものです。コマンド

は、数値の表示のみ影響するもので、MATLABで計算をする方法や保存する方法に影響す

るものではありません。ここでは、異なる大きさの成分からなるベクトルxを使って、種々

の書式設定に従って出力される結果を表示します。

x = [4/3 1.2345e-6]

format short

1.3333 0.0000

format short e

1.3333e+000 1.2345e-006

format short g

1.3333 1.2345e-006

format long

1.33333333333333 0.00000123450000

format long e

1.333333333333333e+000 1.234500000000000e-006

format long g

1.33333333333333 1.2345e-006

format bank

1.33 0.00

format rat

4/3 1/810045

format hex

3ff5555555555555 3eb4b6231abfd271

行列の中の最大の要素が103より大きいかまたは、10-3より小さいならば、MATLABはshort

とlong書式に共通のスケ-リングファクタを適用します。

上で示したformatに加え、

format compact

は、出力の中に現れる多くのブランクラインを取り去ります。この書式は、スクリ-ン

またはウインドウ上に、より多くの情報を表示するためのものです。さらに、出力書式

を制御するためには、sprintfやfprintf関数を使ってください。

出力表示の抑制

あるステ-トメントをタイプし、ReturnまたはEnterを押すと、MATLABは自動的にスク

リ-ン上に結果を表示します。しかし、ラインの終わりにセミコロンを付けることによ

り、計算が完了した後に出力の表示を行なわないようにすることができます。これは、

大きい行列を作成する場合に、特に有効です。たとえば、

A = magic(100);

とすると、計算結果は表示されません。

長いコマンドライン

ステ-トメントが長すぎて1行に収まらない場合、3つ以上のピリオド...を付け、Return

またはEnterを押して、新しい行にコマンドを続けることができます。たとえば、

s = 1 -1/2 + 1/3 -1/4 + 1/5 - 1/6 + 1/7 ...

- 1/8 + 1/9 - 1/10 + 1/11 - 1/12;

=, +, -の周りのブランクやスペ-スはオプションで、読み易くするものです。単一ライ

ンで使うことが可能なキャラクタの最大数は4096です。

コマンドラインの編集

ユ-ザのキ-ボ-ド上の種々の矢印やコントロ-ルキ-を使って、以前にタイプインし

たコマンドを再表示したり、編集したり、再使用したりできます。たとえば、入力ミス

をしたとしましょう。

rho = (1 + sqt(5))/2

ここで、sqrtをタイプミスしています。MATLABは、つぎのように表示します。

Undefined function or variable 'sqt'.

ライン全体をタイプし直す代りに、 キ-を使ってください。タイプミスをした入力ラ

インが再表示されます。 キ-を使ってカ-ソルを移動し、入力し忘れたrを入力してく

ださい。 キ-を連続的に使って、数回前に入力したステ-トメントを再度表示できま

す。数個のキャラクタをタイプして、それに続いて、 キ-を押すと、そのキャラクタ

で始まる前に入力したラインが表示されます。

コマンドラインの編集が可能なキ-の一覧を示しますが、コンピュ-タにより異なりま

す。つぎのキ-を使ってユ-ザのコンピュ-タで利用できるかどうか試してください(こ

れらのキ-のほとんどは、EMACSエディタのユ-ザには馴染みのあるものです)。

�ctrl-p�前のラインを再表示��

ctrl-p 前のラインを再表示

ctrl-n つぎのラインを再表示

ctrl-b 1つキャラクタを左に移動

ctrl-f 1つキャラクタを右に移動

ctrl- ctrl-r 1ワ-ド右に移動

ctrl- ctrl-l 1ワ-ド左に移動

home ctrl-a ラインの先頭に移動

end ctrl-e ラインの最後に移動

esc ctrl-u ラインの削除

del ctrl-d カ-ソルのある位置のキャラ

クタの削除

backspace ctrl-h カ-ソルより前のキャラクタ

を削除

ctrl-k カ-ソルよりラインの最後ま

でを削除

グラフィックス

MATLABは、ベクトルや行列をグラフとして表示したり、これらのグラフに注釈を付けた

り、プリントしたりする拡張機能を用意しています。この節は、いくつかの最も重要な

グラフィックス関数を説明し、アプリケ-ションで使った例題を説明します。

プロットの作成

plot関数は、入力引数により型が異なっています。yがベクトルならば、 plot(y) は、y

の要素のインデックスに対して、yの要素群の区分的な線形グラフを作成します。すなわ

ち、yの要素のインデックスに対して、yの対応する値をプロットし、その点間を直線で

結ぶグラフを表します。引数として2つのベクトルが設定されているplot(x,y)は、xに対

するyのグラフを作成します。

たとえば、ゼロから2 までの正弦波関数値は、つぎのようにプロットします。

t = 0:pi/100:2*pi;

y = sin(t);

plot(t,y)

複数組みのx-yからは、plot関数を1回コ-ルすることで、複数のグラフを作成できます。

MATLABは、自動的に、各デ-タのグル-プを区別するため、前もって設定したカラ-の

優先順位(ユーザ定義も可)を繰り返し使ってラインの区別を行ないます。たとえば、つ

ぎのステ-トメントは、tに関連する3つの関数を種々の色により区別してプロットしま

す。

y2 = sin(t-.25);

y3 = sin(t-.5);

plot(t,y,t,y2,t,y3)

カラ-、ラインスタイル、プラス符号や円のようなシンボルマ-カを設定することもで

きます。

plot(x,y,'color_style_marker')

color_style_markerは、カラ-、ラインスタイル、シンボルマ-カから作られる最大4

つのキャラクタを使った文字列として、全体をシングルコ-トで囲って定義します。

カラ-文字列は、'c', 'm', 'y', 'r', 'g', 'b', 'w', 'k'で設定されます。こ

れらは、シアン、マジェンタ、黄、赤、緑、青、白、黒に対応します。

ラインスタイル文字列は、'-'が実線、'- -'が破線、':'が点線、'-.'が一点鎖線、

'none'はラインなしです。

最も一般的なマ-カのタイプは、'+', 'o', '*', 'x'です。

たとえば、ステ-トメント

plot(x,y,'y:+')

は、各々の対応する点に+マ-クを付け、黄色の点線で表示されます。ラインスタイルを

設定せず、マ-カタイプを設定すると、MATLABはマ-カのみをプロットします。

Figureウインドウ

plot関数は、スクリ-ン上に既にFigureウインドウが開いていなければ、新しいFigure

ウインドウを自動的に開きます。Figureウンドウが存在していると、plot関数は、デフ

ォルトとして、そのウインドウを使います。新しいウインドウを開いて、それをカレン

トFigureにするには、

figure

とタイプします。また、すでに存在しているウインドウをカレントにするには、

figure(n)

とします。ここで、nはFigureタイトルバ-の番号です。その後、続けてグラフィックス

コマンドを使うと、このウインドウ内に表示されます。

既存のグラフにプロットを加える

holdコマンドにより、既存のグラフにプロットを加えることができます。つぎのように

タイプすると、

hold on

</aMATLAB‚Í•AŠù‘¶‚ЃOƒ‰ƒt‚ðŽæ�œ‚©‚È‚¢‚Å�AƒJƒŒƒ“ƒgƒOƒ‰ƒt‚É•V‚µ‚¢ƒf�|ƒ^‚ð‰Á‚

¦‚Ü‚·•B‚»‚µ‚Ä•A•K—v‚È‚ç‚΃XƒP�|ƒŠƒ“ƒO‚ð•Ï•X‚µ‚Ü‚·•B‚½‚Æ‚¦‚ΕApeaks関数のコンタプ

ロットを行ない、つぎに。この関数の疑似カラ-プロットを重ね書きしましょう。

[x,y,z] = peaks;

contour(x,y,z,20,'k')

hold on

pcolor(x,y,z)

shading interp

hold onコマンドは、1ペ-ジ上にcontourプロットとpcolorプロットを重ねて表示します。

サブプロット

関数subplotは、同じウインドウの中に複数のプロットを表示したり、一枚の紙の中にそ

れらをプリントします。

subplot(m,n,p)

とタイプすると、Figureウインドウをm行n列に分割し、カレントプロットをp番目の分割

位置にプロットします。プロットは、Figureウインドウの左上から分割ブロックに沿っ

て右へ番号付けされています。たとえば、Figureウインドウの中の4つの異なる領域にデ

-タをプロットする例を示します。

t = 0:pi/10:2*pi;

[X,Y,Z] = cylinder(4*cos(t));

subplot(2,2,1)

mesh(X)

subplot(2,2,2); mesh(Y)

subplot(2,2,3); mesh(Z)

subplot(2,2,4); mesh(X,Y,Z)

虚数、複素数デ-タ

plotへの引数が複素数の場合、引数が複素数単一の場合を除いて虚数部は無視されます。

この特別な場合として、実部に対して虚部をプロットするための省略形として、コマン

ドを使うことができます。そのため、

plot(Z)

は、Zが複素数ならば、つぎのステ-トメントと等価です。

plot(real(Z),imag(Z))

たとえば、

t = 0:pi/10:2*pi;

plot(exp(i*t),'-o')

は、頂点を小さな円で表わした20角形です。

軸の制御

axis関数は、スケ-リング、方向、縦横比をカスタマイズするオプションをもっていま

す。

通常、MATLABは、デ-タの最大値と最小値を探し、適切なプロットボックスと軸のラベ

ルを選択します。axis関数は、軸の範囲を設定することにより、デフォルト値を書換え

ます。

axis([xmin xmax ymin ymax])

axisは、軸を制御するために数種類のキ-ワ-ドを受け付けます。たとえば、

axis square

は、x軸とy軸の長さを同じにし、

axis equal

は、x軸とy軸の目盛間隔を同じ長さにします。そして、

plot(exp(i*t))

は、axis squareまたはaxis equalを使って楕円形が円に変換されます。

axis auto

は、軸のスケ-リングをデフォルトの自動モ-ドに戻します。

axis on

は、軸のラベルと目盛を表示します。

axis off

は、軸のラベルと目盛を消します。ステ-トメント

grid off

は、グリッドラインを消去し、

grid on

は、グリッドラインを再び表示します。

軸のラベルとタイトル

xlabel, ylabel, zlabel関数は、x-, y-, z-軸にラベルを付けるものです。title関数は、

Figureの上部にタイトルを付けるもので、text関数は、Figureの任意の位置にテキスト

を挿入するものです。Tex記法によるギリシャ文字、数学的な記号、ちょっと変ったフォ

ントも使えます。つぎの例題は、 の代りに ¥leq を、 の代りに¥piを、イタリックフ

ォントの代りに¥itを使ったものです。

t = -pi:pi/100:pi;

y = sin(t);

plot(t,y)

axis([-pi pi -1 1])

xlabel('-¥pi ¥leq ¥itt ¥leq ¥pi')

ylabel('sin(t)')

title('Graph of the sine function')

text(1,-1/3,'¥it{Note the odd symmetry.}')

メッシュプロットとサ-フェスプロット

MATLABは、x-y平面内のグリッド上にその点のz座標を設定し、その隣の点とを直線で繋

いでサ-フェスを定義します。関数meshとsurfは、3次元でサ-フェスを表示します。mesh

は、ワイアフレ-ムサ-フェスを表わし、定義した点を結ぶラインにのみカラ-を設定

します。surfは、定義した点を結ぶラインとサ-フェス面にも共にカラ-を設定します。

2変数関数の可視化

2変数関数、z = f (x,y)を表示するために、関数の領域をカバ-するように、それぞれ

行と列を繰り返し使ってXとY行列を作成します。それで、これらの行列を使って、関数

値を計算し、プロットします。meshgrid関数は、2つのベクトルxとyで定義される領域を

2変数による関数を計算するために使う行列XとYに変換します。Xの行は、ベクトルxのコ

ピ-で、Yの列は、ベクトルyのコピ-です。

2次元sinc関数、sin(r)/rをxとy方向で計算します。

[X,Y] = meshgrid(-8:.5:8);

R = sqrt(X.^2 + Y.^2) + eps;

Z = sin(R)./R;

mesh(X,Y,Z)

この例題の中で、Rは、行列の中心である原点からの距離です。epsを加えたのは、原点

での0/0が中間で生じる問題を避けるためです。

イメ-ジ

2次元配列はイメージとして表示されます。ここで、配列要素はイメ-ジの明るさまたは

カラ-を決めます。たとえば、

load durer

whos

により、デモディレクトリの中のファイルdurer.matは、648行509列の行列Xと128行3列

のmapを含むものであることがわかります。Xの要素は、1から128の範囲内の整数で、カ

ラ-マップmapのインデックスになっています。それで、

image(X)

colormap(map)

axis image

は、この本の初めに示めされるDürerの彫刻を再現します。右上隅にある魔方陣の高分解

能スキャンは、他のファイルに用意しています。

load detail

とタイプして、キ-ボ-ドの上向きの矢印キ-を使って、image, colormap, axisコマン

ドを再実行します。ステ-トメント

colormap(hot)

により、20世紀の色彩から16世紀当時の色彩にしています。

グラフィックスのプリント

Fileメニュ-のPrintオプションとprintコマンドは共にMATLABのFigureをプリントし

ます。Printメニュ-は、一般的な標準のプリントオプションを選択できるようにダイ

アログボックスを表示します。printコマンドは、出力のタイプをより柔軟性をもって扱

え、M-ファイルからプリント機能を制御することができます。結果は、設定したファイ

ルに保存されるかまたは、ユ-ザのデフォルトのプリンタに直接転送することができま

す。PostScriptを含む種々の出力書式が利用できます。

たとえば、つぎのステ-トメントは、カレントFigureウインドウの内容を、

magicsquare.epsと名付けたファイルにカラ-のEncapsulated Level 2 PostScriptとし

て保存します。

print -depsc2 magicsquare.eps

printコマンドを使う前に、ユ-ザのプリンタの機能を知っておくことが重要です。たと

えば、Level 2 PostScriptファイルは、Level 1 PostScriptよりもプリントするとき、

一般に小さく、より速く描くことができます。しかし、PostScriptプリンタはすべてが

Level 2をサポ-トしているわけではありません。それで、ユ-ザの出力デバイスがサポ

-トしているものを知っておく必要があります。MATLABは、黒白出力デバイスに対して

さえも、サ-フェスやパッチに対して濃淡の出力を行なえます。しかし、ラインとテキ

ストは、白または黒のどちらかしか使えません。

ヘルプとオンラインドキュメント

MATLABの機能について、オンライン情報を得るいくつかの異なった方法があります。

helpコマンド

ヘルプウインドウ

MATLAB Help Desk

オンラインリファレンスペ-ジ

The MathWorks, Inc.へのリンク

コマンドhelp

コマンドhelpは、関数の設定法、機能を知る最も基本的な方法です。情報は、直接コマ

ンドウインドウに表示されます。たとえば、

help magic

とタイプすると、つぎの事柄が表示されます。

MAGIC Magic square.

MAGIC(N) is an N-by-N matrix constructed from

the integers 1 through N^2 with equal row,

column, and diagonal sums.

Produces valid magic squares for N = 1,3,4,5....

注意:

MATLABは、関数名と変数名とを他の文字と区別するため、オンラインhelpでは大文字を

使っています。しかし、関数名を入力するときは、MATLABは大文字と小文字の区別を行

ない、すべての関数名は小文字を使っているので、小文字でタイプインしてください。

すべてのMATLAB関数は、論理的にグル-プ分けされ、MATLABのディレクトリ構造は、こ

のグル-プを基にしています。たとえば、線形代数関数はすべてmatfunディレクトリの

中に含まれています。このディレクトリ内のすべての関数名を、簡単な説明と共にリス

トするには、つぎのように行なってください。

help matfun

Matrix functions - numerical linear algebra.

Matrix analysis.

norm - Matrix or vector norm.

normest - Estimate the matrix 2-norm

...

コマンド

help

自身は、すべてのディレクトリを関数のカテゴリの説明と共に表示します。

matlab/general

matlab/ops

...

ヘルプウインドウ

MATLABヘルプウインドウは、PCとMacで利用可能で、Helpメニュ-の下にあるHelp Window

オプションを選択するか、またはメニュ-バ-の疑問符マ-クをクリックすることによ

り使用できます。

helpwin

とタイプすることにより、すべてのコンピュ-タでも利用できます。特定のトピックス

に関してヘルプウインドウを使用するには、

helpwin topic

ヘルプウインドウは、help コマンドと同じ情報を表示しますが、他のトピックスへリン

クすることができ、非常に便利です。

コマンドlookfor

コマンドlookforは、キ-ワ-ドをベ-スに、help テキストの最初の行を通して、関数

を探索します。この最初の行は、各々のMATLAB関数でH1ラインとして知られています。

コマンドlookforは、設定したキ-ワ-ドを含むH1ラインを出力します。たとえば、MATLAB

はinverseという名の関数をもっていません。それで、

help inverse

は、つぎのメッセ-ジを表示します。

inverse.m not found.

しかし、

lookfor inverse

は、1ダ-ス以上の対応する事柄を表示します。ユ-ザがインスト-ルしているToolbox

に依存して、つぎのような表示を得ます。

INVHILB Inverse Hilbert matrix.

ACOSH Inverse hyperbolic cosine.

ERFINV Inverse of the error function.

INV Matrix inverse.

PINV Pseudoinverse.

IFFT Inverse discrete Fourier transform.

IFFT2 Two-dimensional inverse discrete Fourier transform.

ICCEPS Inverse complex cepstrum.

IDCT Inverse discrete cosine transform.

コマンドlookforに、-allを付加することにより、

lookfor -all

は、H1ラインでなく、すべてのヘルプの部分を探索します。

Help Desk

MATLAB Help Deskは、ユ-ザのロ-カルシステムの中のディスクやCD-ROMに保存されて

いる広範囲なヘルプやリファレンス情報にアクセスします。大部分の情報は、HyperText

Markup Language(HTML)を使ってドキュメントで提供されるか、Netscapeまたは

Microsoft ExplorerのようなInternet Webブラウザにアクセスすることで得られます。

Help Deskは、PCやMacでHelpメニュ-のHelp Deskを選択するか、すべてのコンピュ-

タで

helpdesk

とタイプすることで起動します。すべてのMATLABの演算子や関数は、HTML書式でオンラ

インリファレンスペ-ジになっています。これらは、Help Deskから探すことができます。

これらのペ-ジは、基本的なツールのhelpで関数を探すより、より詳しく例題も提供し

ます。このマニュアルを含み、他のドキュメントに関するHTMLバ-ジョンも利用するこ

とができます。ユ-ザ自身のコンピュ-タを実行するサ-チエンジンは、オンラインの

すべてのリファレンスマニュアルを引用することができます。

コマンドdoc

関数の名前を知っている場合は、直接、そのリファレンスページを参照することができ

ます。たとえば、eval関数のリファレンスページを見るには、つぎのようにタイプイン

します。

doc eval

docコマンドは、Webブラウザが起動していなければ、同時に起動します。

オンラインリファレンスペ-ジの印刷

オンラインリファレンスペ-ジのバ-ジョンは、Help Deskを通してPortable Document

Format(PDF)で利用することができます。これらのペ-ジは、AdobeのAcrobat readerに

より処理されます。これらは、プリントするペ-ジを、完全なフォント、グラフィック

ス、書式化されたもの、イメ-ジを含んで、表示したり、フィ-ドしたりします。これ

は、リファレンス資料のプリント出力したものを得るのに最良の方法です。

The MathWorksへのリンク

ユーザのコンピュータがインタネットに接続されているならば、Help Deskにより、

MATLABの開発元The MathWorksに接続することができます。ユーザは、電子メールにより

質問、助言、バグ報告ができます。また、テクニカルサポート情報をベースに最新のデ

ータを引用するために、The MathWorks WebサイトのSolution Search Engineを使うこと

もできます。なお、日本国内のユーザは、サイバネットシステム株式会社の

email:[email protected]

をご利用ください。

MATLAB環境

TMATLAB環境は、実行中に変数群を作成したり、セッション間で共有するプログラムやデ

ータを含むディスクファイルに関係させる機能を提供します。

ワークスペース

ワークスペースは、MATLABコマンドラインからアクセス可能なメモリ部分を意味します。

2つのコマンドwhoとwhos は、ワークスペースのカレントの内容を表示します。whoコマ

ンドは簡単なリストを表示し、whos コマンドは大きさやストレージの情報も表示します。

このテキストの中の例題のいくつかから出力された結果を含んでいるワークスペースに

対してwhosコマンドを適用してみます。MATLABの種々のデータ構造を表示します。練習

として、このテキストの中で記述されているコードを使って、どのような結果が生じる

かを見てください。

whos

Name Size Bytes Class

A 4x4 128 double array

D 5x3 120 double array

M 10x1 3816 cell array

S 1x3 442 struct array

h 1x11 22 char array

n 1x1 8 double array

s 1x5 10 char array

v 2x5 20 char array

Grand total is 471 elements using 4566 bytes.

ワークスペースに存在するすべての変数を削除するには、

clear

とタイプインします。

コマンドsave

ワークスペースの内容を、後でMATLABを起動させて、コマンドloadを使って読み込むこ

とができるMAT-ファイルとして、コマンドsaveで保存することができます。たとえば、

save August17th

は、ワークスペースの中のすべての内容をAugust17th.matファイルに保存します。希望

するならば、ファイル名の後に変数名を設定することにより、特定の変数のみを保存す

ることもできます。

通常、変数はMATLABですぐ読むことができるようにバイナリ書式で保存されます。MATLAB

の外部からこれらのファイルにアクセスする場合、つぎのような書式を設定することも

できます。

-ascii 8桁テキストファイル

-ascii -double 16桁のテキストファイル

-ascii -double -tabs タブで配列要素を分離

-v4 MATLABバージョン4のファイルの

作成

-append 既存のMAT-ファイルにデータを追

ワークスペースの内容をテキスト書式で保存するときは、同時に一変数のみしか保存で

きません。複数の変数を保存すると、MATLABはテキストファイルを作成しますが、MATLAB

に簡単にロ-ドすることはできません。

サーチパス

MATLABは、ディレクトリを順序付けてリストしたサーチパスを使って、ユ-ザがコ-ル

する関数の実行の仕方を決定します。ある標準関数を読み込むと、MATLABは、まず設定

したパス上で最初のM-ファイル関数を実行します。ユーザは、個人的なディレクトリや

サブ関数を使って、これらの実行順を変更することができます。

コマンド

path

は、プラットフォーム上のサーチパスを表示します。PCやMac上で、パスを表示したり、

変更するには、Fileメニュ-からSet Pathを選択してください。

ディスクファイルの管理

コマンドdir, type, delete, cdは、ファイルを管理するため、基本的なオペレーテング

システムのコマンドです。つぎの表は、種々のオペレーティングシステムで、どのよう

に対応しているかを示すものです。

MATLAB MS-DOS UNIX VAX/VMS

dir dir ls dir

type type cat type

delete del or erase rm delete

cd chdir cd set default

これらほとんどのコマンドに対して、パス名、ワイルドカード、ドライブの設定は、通

常の方法で実行できます。

コマンドdiary

コマンドdiaryは、ディスクファイルに、MATLAB実行中の履歴を作成します。ユーザは、

この結果として得られるテキストファイルをワードプロッセサを使って表示したり、編

集したりできます。MATLABからの出力に加えて(グラフ出力は含みません)、ユーザが入

力したすべてのコマンドを含むdiaryと名付けたファイルを作成するには、つぎのように

入力します。

diary

特別なファイル名で保存するには、つぎのようにします。

diary filename

履歴を記録するのを停止するには、つぎのように行ないます。

diary off

外部プログラムの実行

感嘆符(!)はシェルエスケープで、その後に続く入力ラインをオペレーティングシステム

(MacではFinder)へのコマンドとして使用します。この機能は、MATLABを終了しないで、

ユーティリテイや他のプログラムを実行するために非常に有効です。たとえば、VSM上で、

!edt magik.m

は、ファイル名magik.mを編集するためにedtを読み込みます。外部プログラムを終了す

ると、オペレーティングシステムからMATLABに戻ります。

行列と配列について

この節は、つぎの事柄に注目して、行列や配列の機能について、より詳しく示します。

線形代数

配列

多変数データ

線形代数

非公式に、行列や配列と言う項は、しばしば一緒に使われます。より正確には、行列は、

線形変換を表す2次元の数値配列です。行列に定義される数学演算は、線形代数に従いま

す。

Dürerの魔方陣

A =

16 3 2 13

5 10 11 8

9 6 7 12

4 15 14 1

は、MATLABの行列演算の感覚を与えるいくつかの例題を示すために用意したものです。

既に、行列転置(A')については示しました。この行列にその転置行列を加えて対称行列

を作成します。

A + A'

ans =

32 8 11 17

8 20 17 23

11 17 14 26

17 23 26 2

乗算記号(*)は、行と列の間の内積を含む行列乗算を定義します。転置行列との乗算によ

っても対称行列が作成されます。

A'*A

ans =

378 212 206 360

212 370 368 206

206 368 370 212

360 206 212 378

この特別な行列の行列式はゼロになり、これは非正則であることを示します。

d = det(A)

d =

0

A行列の行をベースにピボット操作を行なうと、単位行列にならないことがわかります。

R = rref(A)

R =

1 0 0 1

0 1 0 -3

0 0 1 3

0 0 0 0

行列が非正則なので、逆行列を計算することはできません。つぎのステートメントで逆

行列を計算しようとすると、

X = inv(A)

は、つぎのワ-ニングメッセージを表示します。

Warning: Matrix is close to singular or badly scaled.

Results may be inaccurate. RCOND = 1.175530e-017.

丸め誤差が、行列の逆行列を求めるアルゴリズムの中で、厳密な意味の特異性を検出す

ることを不可能にしています。しかし、rcond、すなわち、reciprocal condition estimateの略、からの出力値は、浮動小数点相対精度のeps程度の大きさで、そのため、計算され

る逆行列は、あまり有効なものでないことを示します。

魔方陣の固有値には、興味があります。

e = eig(A)

e =

34.0000

8.0000

0.0000

-8.0000

固有値の中の一つがゼロになっていて、これが非正則の結果になります。最大固有値は

34で、魔方陣の各行、列の和と同じです。これは、固有ベクトルがすべて1のベクトルに

なるものが存在しているからです。

v = ones(4,1)

v =

1

1

1

1

A*v

ans =

34

34

34

34

魔方陣を各行または列の和でスケーリングすると、

P = A/34

は、各行と列の和がすべて1になるdoubly stochastic行列になります。

P =

0.4706 0.0882 0.0588 0.3824

0.1471 0.2941 0.3235 0.2353

0.2647 0.1765 0.2059 0.3529

0.1176 0.4412 0.4118 0.0294

このような行列は、Markov過程の中で遷移的な確率を表しています。行列の繰り返しの

乗算は、過程の繰り返しステップを表します。この例題で、5次のべき乗を計算します。

P^5

は、つぎのようになります。

0.2507 0.2495 0.2494 0.2504

0.2497 0.2501 0.2502 0.2500

0.2500 0.2498 0.2499 0.2503

0.2496 0.2506 0.2505 0.2493

この結果は、kが無限大に近づくに連れ、k次のべき乗Pkのすべての要素は1/4に近づくこ

とを示しています。

最終的に、特性方程式の係数

poly(A)

は、

1 -34 -64 2176 0

になります。このことは、特性多項式

det( A - I )

は、

4 - 34 3 - 64 2 + 2176

となることを示しています。行列は非正則なので、定数項はゼロです。そして、3次の項

の係数は-34で、これは魔方陣のためです。

配列

線形代数の世界から離れたとき、行列は2次元の数値配列になります。配列上の代数演算

は、要素単位に行われます。このことは、加算、減算では、行列も配列も同じで、乗算

演算では異なることになります。MATLABでは、乗法的配列演算をドット点、小数点を使

って表現します。演算記号の一覧を示します。

+ 加算

- 減算

.* 要素単位の乗算

./ 要素単位の除算

.\ 要素単位の左除算

.^ 要素単位のべき乗

.' 共役を計算しないで転置の

みを行なう

Dürerの魔方陣に、要素単位でそれ自身を乗算すると、

A.*A

結果は1から16までの整数の二乗を含んだ配列になります。

ans =

256 9 4 169

25 100 121 64

81 36 49 144

16 225 196 1

配列演算は、テーブルを作成するのに有効です。nを列ベクトルとしましょう。

n = (0:9)';

そして、つぎのステ-トメントを考えます。

pows = [n n.^2 2.^n]

この結果は、二乗と2のベき乗のテーブルになります。

pows =

0 0 1

1 1 2

2 4 4

3 9 8

4 16 16

5 25 32

6 36 64

7 49 128

8 64 256

9 81 512

初等数学関数は、配列上に要素単位で働きます。

format short g

x = (1:0.1:2)';

logs = [x log10(x)]

により、対数テーブルを作成することができます。

logs =

1.0 0

1.1 0.04139

1.2 0.07918

1.3 0.11394

1.4 0.14613

1.5 0.17609

1.6 0.20412

1.7 0.23045

1.8 0.25527

1.9 0.27875

2.0 0.30103

多変数データ

MATLABは、多変数統計データに対して列方向の解析を行ないます。データの中の各々の

列は1つの変数を表し、行は観測値です。(i,j)番目の要素は、j番目の変数のi番目の観

測値です。

たとえば、3変数をもつデータを考えましょう。

心拍数

体重

週に行なう運動時間

5つの観測値に対して、結果の配列は、つぎのようになります。

D =

72 134 3.2

81 201 3.5

69 156 7.1

82 148 2.4

75 170 1.2

最初の行は、患者1の心拍数、体重、運動時間を、2番目の行は、患者2の、等を含みます。

さて、MATLABのデ-タ解析関数を適用してみましょう。たとえば、各列の平均、標準偏

差を計算します。

mu = mean(D), sigma = std(D)

mu =

75.8 161.8 3.48

sigma =

5.6303 25.499 2.2107

MATLABの中で利用可能なデ-タ解析関数の一覧は、つぎのステ-トメントで得られます。

help datafun

Statistics Toolboxにアクセスしたいなら、

help stats

とタイプしてください。

スカラ拡張表現

行列とスカラは、種々の方法で組合わされます。たとえば、スカラは、行列との減算で

は、行列の各要素から自分自身を差し引きます。ここでの例題の魔方陣で、要素の平均

値は8.5です。それで、

B = A - 8.5

は、列の和がゼロになる行列を作成します。

B =

7.5 -5.5 -6.5 4.5

-3.5 1.5 2.5 -0.5

0.5 -2.5 -1.5 3.5

-4.5 6.5 5.5 -7.5

sum(B)

ans =

0 0 0 0

スカラの拡張と共に、MATLABは範囲内のすべてのインデックスに設定したスカラ値を与

えることができます。たとえば、

B(1:2,2:3) = 0

は、Bのある部分をゼロに設定します。

B =

7.5 0 0 4.5

-3.5 0 0 -0.5

0.5 -2.5 -1.5 3.5

-4.5 6.5 5.5 -7.5

論理サブスクリプト

論理演算や比較演算から作成される論理ベクトルが、サブ配列を参照するのに使われま

す。Xを通常の行列で、Lをある論理演算の結果求まった同じサイズの行列とします。そ

して、X(L)は、Lの要素がゼロでない部分のXの要素を設定します。

この種のサブスクリプト機能は、サブスクリプト表現と同じように論理演算を設定する

ことにより1ステップの中で処理されます。つぎのデ-タを考えましょう。

x =

2.1 1.7 1.6 1.5 NaN 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8

NaNは、質問表で答えられなかったものに対応する項目のような、デ-タの欠如部です。

論理インデックスfinite(x)を使って欠落デ-タを取除くため、有限の数値には真、NaN

やInfに対しては偽とします。

x = x(finite(x))

x =

2.1 1.7 1.6 1.5 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8

ある観測値5.1は、他のものと比べ非常に異なって見えます。これを異常値と言います。

ここでの例題では、平均値から標準偏差の3倍以上の部分を、異常値として、取除きます。

x = x(abs(x-mean(x)) <= 3*std(x))

x =

2.1 1.7 1.6 1.5 1.9 1.8 1.5 1.8 1.4 2.2 1.6 1.8

他の例題として、Dürerの魔方陣の中で、論理インデックス法とスカラ拡張法を使って素

数でないものに0を設定して素数の位置を強調します。

A(~isprime(A)) = 0

A =

0 3 2 13

5 0 11 0

0 0 7 0

0 0 0 0

関数find

関数findは、与えられた論理状態になる配列要素のインデックスを決めます。この最も

簡単な型では、関数findがインデックスの列ベクトルを出力します。インデックスの行

ベクトルを得るためには、そのベクトルを転置します。たとえば、

k = find(isprime(A))'

は、1次元のインデックス法を使って、魔方陣の中の素数の位置を出力します。

k =

2 5 9 10 11 13

これらの素数を表示するのに、kにより決められた順番に行ベクトルとして配列します。

A(k)

ans =

5 3 2 11 7 13

左辺のインデックスとして、代入ステ-トメントにkを使ったとき、行列構造は保存され

ます。

A(k) = NaN

A =

16 NaN NaN NaN

NaN 10 NaN 8

9 6 NaN 12

4 15 14 1

フロ-コントロ-ル

MATLABは、5つのフロ-コントロ-ルを作成できます。

ifステ-トメント

switchステ-トメント

forル-プ

whileル-プ

breakステ-トメント

ifステ-トメント

ifステ-トメントは、ある論理式を評価して、それが真のとき、一つのステ-トメント

群を実行します。オプションのキーワードelseifやelseは、別のステ-トメント群の実

行に関するものです。ifに関連したキーワードendは、ifとendで挟まれた間のステ-ト

メントの実行を終了します。ステ-トメント群は、4つのキ-ワ-ドif,else,elseif,end

で区別されます。その中には、丸括弧や鍵括弧は含まれていません。

次数nの魔方陣を作成するMATLABのアルゴリズムは、3つの異なる場合を含んでいます。

すなわち、nが奇数のとき、偶数ですが4の倍数のときと、倍数でないときの3ケ-スです。

つぎのように記述します。

if rem(n,2) ~= 0

M = odd_magic(n)

elseif rem(n,4) ~= 0

M = single_even_magic(n)

else

M = double_even_magic(n)

end

この例題で、3つの場合は、お互いに相反するものです。最初に真になる状態が機能しま

す。

比較演算子とifステ-トメントが行列にどのように機能するかを理解することは重要で

す。2つの変数間の等価性をチェックしようとすると、つぎのステ-トメントを使います。

if A == B, ...

これは、正しいMATLABの使い方で、AとBがスカラのときに期待することを実行します。

しかし、AとBが行列ならば、A == Bは、それらが等しいかどうかをチェックしないで、

それらの等しい部分を探します。すなわち、結果は、個々の要素を比較してお互いが等

しければ1を、等しくなければ0を出力する行列です。実際に、AとBが同じ大きさでなけ

れば、A == Bはエラ-になります。

2つの変数間の等価性をチェックする適切な方法は、関数isequalを使うことです。

if isequal(A,B), ...

です。つぎに、このことを強調する他の例題を示します。AとBがスカラならば、つぎの

プログラムは、予想通りの結果になります。例題で使っている列を交換した魔方陣を含

む行列のほとんどの組み合わせに対して、すべての要素に対して行列の関係A > B,A < B,A

== Bのいずれも成り立たなく、そのためelseの部分が実行されます。

if A > B

'greater'

elseif A < B

'less'

elseif A == B

'equal'

else

error('Unexpected situation')

end

つぎの関数は、ifと共に使って、行列の比較結果をスカラ条件にするのに使うことがで

きます。

isequal

isempty

all

any

switchとcase

switchステ-トメントは、変数や表現式の値をベ-スにあるステートメント群を実行し

ます。キ-ワ-ドcaseとotherwiseは、ステ-トメント群の区別を行ないます。最初に一

致した場合のみ実行します。switchに対応するendが必ず存在します。

魔方陣アルゴリムズのロジックも、つぎのように表現できます。

switch (rem(n,4)==0) + (rem(n,2)==0)

case 0

M = odd_magic(n)

case 1

M = single_even_magic(n)

case 2

M = double_even_magic(n)

otherwise

error('This is impossible')

end

Cプログラマへの助言

C言語のswitchステ-トメントと異なり、MATLABのswitchは、何かを必ず実行します。最

初の場合のステ-トメントが真ならば、他の場合のステ-トメントは実行しません。そ

れで、breakステ-トメントは必要ありません。

forループ

forル-プは、前もって定義した固定回数だけ一つのステ-トメント群を実行します。対

応するend でステ-トメント群を区別します。

for n = 3:32

r(n) = rank(magic(n));

end

r

ル-プ内のステ-トメントの最後のセミコロンは、繰り返し表示されないようにして、

最後の結果を表示するため、ル-プ終了後にrを使います。

読み易くするため、ル-プを階段状にすることは良い考えです。特にいくつかのル-プ

を使うときには便利です。

for i = 1:m

for j = 1:n

H(i,j) = 1/(i+j);

end

end

whileループ

whileル-プは、回数を定義しないで、繰り返し回数を論理条件によりコントロ-ルする

ときに使います。これにも、対応するendによりステートメント群を表現します。

つぎに、while, if, else, endを使ったプログラムを示します。これは、多項式の零点

を求めるために区間二分割を使います。

a = 0; fa = -Inf;

b = 3; fb = Inf;

while b-a > eps*b

x = (a+b)/2;

fx = x^3-2*x-5;

if sign(fx) == sign(fa)

a = x; fa = fx;

else

b = x; fb = fx;

end

end

x

結果、多項式x3 - 2x - 5の根が、つぎのように求まります。

x =

2.09455148154233

ifステ-トメントの節で議論した行列比較に含まれる注意は、whileステ-トメントでも

適用されます。

breakステートメント

breakステ-トメントは、forまたはwhileル-プから抜け出すものです。ネスティングさ

れたループの中では、breakは、最も内部のル-プのみから抜け出します。

前の節の例題を改良したものをつぎに示します。breakの使用がなぜ良い考えなのです

か?

a = 0; fa = -Inf;

b = 3; fb = Inf;

while b-a > eps*b

x = (a+b)/2;

fx = x^3-2*x-5;

if fx == 0

break

elseif sign(fx) == sign(fa)

a = x; fa = fx;

else

b = x; fb = fx;

end

end

x

他のデ-タ構造

この節は、MATLABの他のデ-タ構造について紹介します。つぎの事柄が含まれています。

多次元配列

セル配列

キャラクタとテキスト

構造体

多次元配列

MATLABの多次元配列は、2つ以上のサブスクリプトをもった配列です。これは、2つ以上

の引数と共にzeros, ones, rand, randn を使って作成されます。たとえば、

R = randn(3,4,5);

は、3X4X5=60個の正規分布する乱数要素をもった3X4X5の配列を作成します。

3次元配列は、3次元の物理的なデ-タを表わします。たとえば、長方形グリッドでサン

プルした室内の温度を表わします。また、時間依存の行列A(t)のサンプルや行列の数列

A(k)を表わします。これら格子型の場合では、k番目行列またはtk番目の行列の(i, j)番目の要素をA(i,j,k)で表わします。

MATLABの4次の魔方陣とDürerの魔方陣は、2つの列が入れ替わっています。同様に、列を

入れ替えることにより、異なる魔方陣をいくつか作ることができます。ステ-トメント

p = perms(1:4);

は、1:4の順列4!=24の組合せがあります。k番目の順列は、行ベクトルp(k,:)です。それ

で、

A = magic(4);

M = zeros(4,4,24);

for k = 1:24

M(:,:,k) = A(:,p(k,:));

end

は、3次元配列Mに24種の魔方陣をストアします。Mの大きさは、

size(M)

ans =

4 4 24

22番目の行列がDürerの魔方陣であることがわかります。

M(:,:,22)

ans =

16 3 2 13

5 10 11 8

9 6 7 12

4 15 14 1

ステ-トメント

sum(M,d)

は、d番目のサブスクリプトを変更して和を計算します。

sum(M,1)

は、24個の行ベクトル

34 34 34 34

を含む1X4X24配列になります。そして、

sum(M,2)

は、24個の列ベクトル

34

34

34

34

を含む4X1X24配列になります。最終的に、

S = sum(M,3)

は、24個の行列を足したものになります。結果は。4X4X1になり、4行4列の配列に見えま

す。

S =

204 204 204 204

204 204 204 204

204 204 204 204

204 204 204 204

セル配列

MATLABの中でセル配列は、多次元配列で、その要素は異なる配列から作成されます。空

行列のセル配列は、関数cellで作成できます。しかし、非常に頻繁に、セル配列は、中

括弧 {}を使って、種々雑多に選択したものを囲むことで作成されます。中括弧は種々の

セルの内容にアクセスするためのサブスクリプトと共に使われることもあります。たと

えば、

C = {A sum(A) prod(prod(A))}

は、1行3列のセル配列です。3つのセルは、魔方陣、列方向の和を表わす行ベクトル、そ

のすべての要素の積から構成されています。Cを表示すると、つぎのようになります。

C =

[4x4 double] [1x4 double] [20922789888000]

これは、最初の2つのセルは、スペ-スの関係で出力するには大き過ぎるためです。しか

し、3番目のセルは一つの数値16!なので、出力されています。

憶えておく必要のある2つの重要なことがあります。まず、セルの中の個々の内容を取り

出すには、サブスクリプトを中括弧で囲んで使います。例えば、C{1}は魔方陣、C{3}は

16!になります。第2番目に、セル配列は、他の配列の内容を変更するものではなく、単

にコピーしたもので、他の配列へのポインタではありません。設定した後で、Aを変化さ

せても、Cは何も変化しません。

3次元配列は、同じ大きさの一連の行列をストアするときに使うことができます。セル配

列は、異なる大きさの一連の行列をストアするためにも使うことができます。たとえば、

M = cells(8,1);

for n = 1:8

M{n} = magic(n);

end

M

は、異なる次数の魔方陣列を作成します。

M =

[ 1]

[ 2x2 double]

[ 3x3 double]

[ 4x4 double]

[ 5x5 double]

[ 6x6 double]

[ 7x7 double]

[ 8x8 double]

今まで使ってきた馴染みのある魔方陣は

M{4}

です。

キャラクタとテキスト

MATLABへテキストを入力するには、シングルコ-トを使って入力します。たとえば、

s = 'Hello'

結果は、今まで取扱ってきた数値行列や配列と異なる種類のものです。これは、1行5列

のキャラクタ配列です。

内部的に、キャラクタは数字としてストアされますが、浮動小数点書式ではありません。

ステ-トメント

a = double(s)

は、キャラクタ配列をASCIIコ-ドの浮動小数点表現を含む数値行列に変換します。結果

は、つぎのようになります。

a =

72 101 108 108 111

ステ-トメント

s = char(a)

は、逆の変換を行ないます。

数字をキャラクタに変換することは、ユ-ザのコンピュ-タの中で使用可能なフォント

の種類を調べることができます。基本的なASCIIキャラクタセットの中でプリント可能な

キャラクタは、整数32:127で表示されます(32より小さい整数は、プリントできない制御

キャラクタを表わします)。これらの整数を適切な6行16列の配列に並べます。

F = reshape(32:127,16,6)';

拡張したASCIIキャラクタセットの中のプリント可能なキャラクタは、F+128で表わせま

す。これらの整数がキャラクタとして解釈するとき、結果は現在使われているフォント

に依存します。つぎのステ-トメントをタイプします。

char(F)

char(F+128)

そして、MATLABコマンドウインドウに対して使われているフォントは変化します。PCと

Macに対して、Fileメニュ-からPreferencesを選択します。ユ-ザの使っているコンピ

ュ-タがWingdingsフォントとSymbolフォントをもっているなら、それを使ってみてく

ださい。つぎに、出力される例を示してみましょう。

!"#$%&'()*+,-./

0123456789:;<=>?

@ABCDEFGHIJKLMNO

PQRSTUVWXYZ[¥]^_

'abcdefghijklmno

pqrstuvwxyz{|}~&shy;

°¢£§·¶ß®© ´¨¦ÆØ

ױ𠥵¹²³¼½ªº¾æø

¿¡¬ÐÝý«» þÀÃÕ

""`'÷ÞÿY/¤ __

· ÂÊÁËÈÍÎÏÌÓÔ

ÒÚÛÙ ~¯ °¸" ÿ

鍵括弧の中の連結は、テキスト変数をより大きい文字列にします。ステ-トメント

h = [s, ' world']

は、横方向に文字列を連結し、つぎの結果を出力します。

h =

Hello world

ステ-トメント

v = [s; 'world']

は、縦方向に文字列を連結し、つぎの結果を出力します。

v =

Hello

world

hの中で'w'の前にブランクが挿入されていなければならないことと、vの中で二つのワ-

ドは同じ長さでなければならないことに注意してください。結果の配列は、共にキャラ

クタ配列で、hは1行11列で、vは2行5列です。

異なる長さのラインを含むテキストの内容を取扱うには、キャラクタ配列を付け加えて

同じ長さにするか、または文字のセル配列にするかの2つの方法があります。関数char

は、数行のラインを入力できますが、それら各々のラインがすべて同じ長さであるよう

にブランクを加えられます。そして、各々のラインが行ごとに分割されたキャラクタ配

列を作成します。たとえば、

S = char('A','rolling','stone','gathers','momentum.')

は、5行9列のキャラクタ配列になります。

S =

A

rolling

stone

gathers

momentum.

Sの最初の4つの行には、各行を同じ長さにするために必要なブランクがあります。また、

一つのセル配列にテキストをストアすることもできます。たとえば、

C = {'A';'rolling';'stone';'gathers';'momentum.'}

は、5行1列のセル配列になります。

C =

'A'

'rolling'

'stone'

'gathers'

'momentum.'

ブランクが追加されたキャラクタ配列をつぎのコマンドで文字列からなるセル配列に変

換できます。

C = cellstr(S)

そして、逆も可能です。

S = char(C)

構造体

構造体は、 メンバ変数(textual field designators)によりアクセスできる要素をもつ

多次元MATLAB配列です。たとえば、

S.name = 'Ed Plum';

S.score = 83;

S.grade = 'B+'

は、3つのメンバをもったスカラ構造体を作成します。

S =

name: 'Ed Plum'

score: 83

grade: 'B+'

MATLABの中のすべてのものと同じように、構造体は配列で、そのため付加的な要素も挿

入することができます。この場合、配列の各々の要素は、いくつかのメンバをもった構

造体です。メンバは、一度に一つのものを加えることができます。

S(2).name = 'Toni Miller';

S(2).score = 91;

S(2).grade = 'A-';

または、すべての要素が単一ステ-トメントで加えられます。

S(3) = struct('name','Jerry Garcia',...

'score',70,'grade','C')

今、構造体は、内容の概略だけをプリントしても十分に大きいものです。

S =

1x3 struct array with fields:

name

score

grade

種々のメンバを他のMATLAB配列に集め直すのにいくつかの方法があります。これらは、

コンマでリストを分離する記法をもとにしています。つぎのようにタイプすると、

S.score

つぎの事柄と等価です。

S(1).score, S(2).score, S(3).score

これは、各要素をコンマによる分離で表現するものです。他の句読点を使うことはでき

ません。 これは、一度に3つのスコアをデフォルト変数ansに割当て、各々の割当ての結

果を、忠実に表示します。しかし、つぎのように鍵括弧で囲むと

[S.score]

は、

[S(1).score, S(2).score, S(3).score]

と同じで、各スコアすべてを含む数値行ベクトルを作成します。

ans =

83 91 70

同様に、

S.name

とタイプすると、変数ansに一度にnameを割当てます。しかし、中括弧を使った表現

{S.name}

は、3つのnameを含む1X3のセル配列を作成します。

ans =

'Ed Plum' 'Toni Miller' 'Jerry Garcia'

そして、

char(S.name)

は、メンバnameから1つのキャラクタ配列を作成するため、3つの引数と共にchar関数を

読み込みます。

ans =

Ed Plum

Toni Miller

Jerry Garcia

スクリプトとファンクション

MATLABは、対話形式の計算環境と同様に強力なプログラミング言語です。MATLAB言語の

中のコードを含むファイルをM-ファイルと言います。ユーザは、テキストエディタを使

ってM-ファイルを作ります。そして、それらを他のMATLAB関数またはコマンド同様に使

うことができます。

M-ファイルには2種類のものがあります。

スクリプト、このファイルは、入力引数を受け入れたり、出力引数を出力したり

しません。このファイルは、ワークスペースの中のデータを使います。

ファンクション、このファイルは、入力引数を受け入れ、出力引数を出力します。

内部変数は、関数のローカル変数です。

ユーザがMATLABのプログラミングを始めたばかりならば、カレントディレクトリに実行

しようとするM-ファイルを作成してください。ユーザ自身のM-ファイルが沢山完成した

なら、他のディレクトリにそれらをまとめて、個人的なToolboxを作成してください。そ

して、MATLABのサーチパスに加えてください。

関数名が重複したら、MATLABはサーチパスの中で最初に現れるファイルを実行します。

たとえば、 myfunction.mの内容を表示するには、つぎのようにします。

type myfunction

スクリプト

ユーザが、スクリプトを読み込むと、MATLABは、単にファイルの中のコマンドを実行し

ます。スクリプトは、ワークスペースの中に存在するデータを取り扱うか、または、演

算するための新しいデータを作成します。スクリプトは、出力引数を出力しませんが、

作成する変数はワークスペースに残り、その後の計算に使われます。加えて、スクリプ

トは、plotコマンド等を使って、グラフィカル出力を作成することができます。

たとえば、つぎのMATLABコマンドを含んだmagicrank.mと呼ばれるファイルを作成します。

% 魔方陣のランクの計算

r = zeros(1,32);

for n = 3:32

r(n) = rank(magic(n));

end

r

bar(r)

ステートメント

magicrank

により、MATLABはコマンドを実行し、最初の30個の魔方陣のランクを計算し、結果を棒

グラフにプロット表示します。ファイルの実行が終了すると、変数nとrがワークスペー

スに残ります。

ファンクション

ファンクションは、入力引数をもち、出力引数を出力するM-ファイルです。M-ファイル

の名前と関数の名前は同じものにしてください。ファンクションM-ファイルは、それ自

身がもつワークスペースの中で変数を使い、MATLABコマンドプロンプトでアクセスする

ワークスペースと区別します。

良い例題は、 rankを使って示されます。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)) * norm(A) * eps.

s = svd(A);

if nargin==1

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

end

r = sum(s > tol);

です。

ファンクションM-ファイルの最初の行は、functionと言うキーワードで始まります。こ

れは、関数名と引数の順序を与えるものです。この例題では、入力引数は2つで、出力引

数は1です。

最初のブランク行または実行可能行までの数行は、ヘルプテキストを与えるコメント行

です。これらの行は、ユーザが

help rank

とタイプすることで、表示されます。ヘルプテキストの最初の行は、H1ラインと言われ、

lookforコマンドを使うか、またはディレクトリ上のhelp によりMATLABが表示するもの

です。

ファイルの残りは、関数を定義している実行可能なMATLABコードです。最初の行の中の

変数r, A tolと同様に関数の中に導入されている変数sは、すべて関数のローカル変数で

す。すなわち、MATLABワークスペースの中の変数とは異なるものです。

この例題は、MATLAB関数の一つの見方を示すもので、通常の他のプログラミング言語の

中には見られません。すなわち、引数の数を可変にできます。rank関数は、種々の方法

で使うことができます。

rank(A)

r = rank(A)

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

多くのM-ファイルは、この方法で実行します。出力引数を設定しなければ、結果はans

にストアされます。2番目の入力引数が設定されなければ、関数はデフォルト値を使って

計算します。関数の中で、narginとnargoutと名付けられた2つの量は、関数の中で特殊

な使い方で、入力引数の数や出力引数の数を出力するものです。rank関数はnarginを使

っていますが、nargoutは使う必要がありません。

グローバル変数

一つの変数の単一コピーを共有し、複数の関数で使いたい場合、変数をすべての関数の

中で単にglobalとして宣言してください。変数をアクセスするために基本ワークスペー

スを使う場合、コマンドラインで同じこと(グローバル宣言)をします。グローバル宣言

は、変数が実際に関数の中で使われる前に行なわなければなりません。絶対に必要では

ありませんが、大文字を使うことにより、他の変数と区別できて、便利です。たとえば、

falling.mと呼ばれるM-ファイルを作成します。

function h = falling(t)

global GRAVITY

h = 1/2*GRAVITY*t.^2;

そして、対話的にステートメントを入力します。

global GRAVITY

GRAVITY = 32;

y = falling((0:.1:5)');

2つのグローバルステートメントが、関数の内部で利用可能なコマンドプロンプトで

GRAVITYに値を割り当てます。いくつかのファイルを編集しないで、対話的にGRAVITYを

変更して、新しい解を得ることもできます。

コマンド/関数の双対性

MATLABコマンドは、つぎのようなステ-トメントです。

load

help

多くのコマンドは、オペランドを設定する修飾子を使うこともできます。

load August17.dat

help magic

type rank

コマンド修飾子を与える別の方法は、関数に文字列引数をもたせることです。

load('August17.dat')

help('magic')

type('rank')

これが、MATLABの"コマンド/関数の双対性"です。つぎの型のコマンド

command argument

は、関数型でつぎのように記述されます。

command('argument')

文字列引数が他の部分を使って作られるとき、関数型アプローチの利点があります。つ

ぎの例題は、複数のデータファイルAugust1.dat, August2.dat等々を処理します。整数

をキャラクタ文字列への変換する関数int2strを使ってファイル名を作成します。

for d = 1:31

s = ['August' int2str(n) '.dat']

load(s)

% d番目のファイルの内容を処理します。

end

関数eval

関数evalは、強力なテキストマクロ機能を実行するためテキスト変数と共に機能します。

式またはステートメント

eval(s)

は、MATLABインタプリタを使って、テキスト文字列sに含まれる式を計算するか、または

ステートメントを実行します。

前の節の例題は、つぎのコードを使っても処理できますが、関数を読み込むのではなく、

すべてのインタプリタを使うので、若干効率が落ちます。

for d = 1:31

s = ['load August' int2char(n) '.dat']

eval(s)

% d番目のファイルの内容を処理

end

ベクトル化

MATLABをスピードアップするには、ユーザのM-ファイルのアルゴリズムをベクトル化す

ることが重要です。他のプログラミング言語がforまたはDOループを使う部分で、MATLAB

はベクトルまたは行列演算を使うことができます。つぎのコードは、簡単な例題として、

対数表を作成するものです。

x = 0;

for k = 1:1001

y(k) = log10(x);

x = x + .01;

end

MATLABを既にお使いの方は、"ループを使って、記述するのには、人生は短すぎる"

と言います。

同じコードのベクトル化されたバージョンは、つぎのようになります。

x = 0:.01:10;

y = log10(x);

さらに複雑なコードに対しては、ベクトル化オプションが必ず良いとは限りません。し

かし、スピードが問題になるときは、ユーザのアルゴリズムをベクトル化する方法を必

ず探してみてください。

前もってスペースを確保する

コードの一部をベクトル化することができない場合、forループをスピードアップするた

めは、出力結果をストアするベクトルまたは配列を前もって設定してください。たとえ

ば、つぎのコードは、forループで作成されるベクトルを前もって作成するために関数

zerosを使うものです。これにより、実行時間がかなり速くなります。

r = zeros(32,1);

for n = 1:32

r(n) = rank(magic(n));

end

前の例題の中で前もってスペースを設定しないと、MATLABインタプリタは、ループに関

する1回の実行で、1要素ずつrベクトルを拡大します。ベクトルの領域を前もって確保す

ることは、このステップを省略させ、より高速の実行になります。

関数を引数とする関数

"関数を引数とする関数"と呼ばれる関数クラスは、スカラ変数の非線形関数と共に機能

します。これは、一つの関数が他の関数上で機能するものです。つぎのような事柄を含

んでいます。

ゼロ点の検出

最適化

求積

常微分方程式

MATLABは、ファンクションM-ファイルを使って、非線形目的関数を表現します。たとえ

ば、matlab/demosディレクトリからhumpsの簡単なバージョンを示します。

function y = humps(x)

y = 1./((x-.3).^2 + .01) + 1./((x-.9).^2 + .04) - 6;

区間 0 x 1で、この関数を計算します。

x = 0:.002:1;

y = humps(x);

そして、関数をプロットします。

plot(x,y)

グラフは、関数がx = 0.6近傍で極小値をもつことを示しています。関数fminsは、関数

の最小値をもつxの値、最小点を探索します。fminsへの最初の引数は、最小化される関

数名、2番目の引数は最小値の位置のラフな推定値です。

p = fmins('humps',.5)

p =

0.6370

最小点で、関数を計算するには、

humps(p)

ans =

11.2528

数値解析は、定積分の数値的近似と常微分方程式の数値積分の間を区別するため求積と

積分の項を使います。MATLABの求積ルーチンは、quadとquad8です。ステートメント

Q = quad8('humps',0,1)

は、グラフ曲線の下の領域を計算し、その結果を出力します。

Q =

29.8583

最終的に、グラフは、関数がこの区間でゼロにならないことを示しています。それで、

つぎのステートメントでゼロの位置を探索します。

z = fzero('humps',.5)

結果、区間の外に見つかました。

z =

-0.1316

Handle Graphics

MATLABは、ライン、サーフェス、その他のグラフィックスオブジェクトの作成や取り扱

いを行なう低水準関数を提供します。このシステムは、Handle Graphics®と言われます。

グラフィックスオブジェクト

グラフィックスオブジェクトは、MATLABのHandle Graphicsシステムの基本的な描画要素

です。オブジェクトは、階層構造をもつツリー構造で構成されています。これは、グラ

フィックスオブジェクトの内部従属性を反映しています。たとえば、Lineオブジェクト

は、リファレンスのフレームとしてAxesオブジェクトを必要とします。また、Axesオブ

ジェクトは、Figureオブジェクトの中にのみ存在します。

グラフックスオブジェクト

11種類のHandle Graphicsオブジェクトがあります。

Rootオブジェクト:

このオブジェクトは、階層構造の頂点の部分です。これは、コンピュータのスク

リーンに対応します。MATLABは、自動的にセッションの最初にRootオブジェクト

を作成します。

Figureオブジェクト:

このオブジェクトは、Commandウィンドウ以外のルートスクリーン上のウィンドウ

です。

Uicontrolオブジェクト:

このオブジェクトは、ユーザがオブジェクトをアクティブにするとき、ある関数

を実行するユーザインタフェースコントロールです。これらのオブジェクトは、

プッシュボタン、ラジオボタン、スライダが含まれます。

Axesオブジェクト:

このオブジェクトは、Figureウィンドウの中にある領域を定義し、この領域の中

の子オブジェクトの方向付けを行ないます。

Uimenuオブジェクト:

このオブジェクトは、Figureウィンドウの上部に位置するユーザインタフェース

メニュ-です。

Image オブジェクト:

このオブジェクトは、カラーマップのインデックスに従って長方形配列の要素を

使ってMATLABが表現する2次元オブジェクトです。

Lineオブジェクト:

このオブジェクトは、ほとんどの2次元プロットに対して基本的なグラフィックス

要素です。

Patchオブジェクト:

このオブジェクトは、エッジをもち、内部が塗り潰された多角形です。単一Patch

は、多表面やカラーまたは内挿されたカラーで独立に色付けされたものを含みま

す。

Surfaceオブジェクト:

このオブジェクトは、x-y平面上で高さとしてデータの値をプロットすることによ

り作成される行列データの3次元表現です。

Textオブジェクト:

このオブジェクトは、キャラクタ文字列です。

Lightオブジェクト:

このオブジェクトは、Axesの中のすべてのオブジェクトに与える光源を定義しま

す。

オブジェクトハンドル

すべての個々のグラフィックスオブジェクトは、ハンドルと呼ばれるユニークな識別子

をもっています。これは、MATLABがオブジェクトを作成したときに、ユニ-クな値(ハン

ドル番号)が割り当てられます。複数のラインをもつようなグラフは、各々のラインがそ

れ自身のハンドルをもつ複数オブジェクトから作成されています。ハンドル番号が必要

なときは、いつでもある変数に値をストアし、その変数を使うことをお薦めします。

Rootオブジェクトのハンドル番号は、常にゼロです。Figureのハンドル番号は、デフォ

ルトでは整数で、ウィンドウのタイトルの中に表示されます。他のオブジェクトハンド

ル番号は、MATLABにより使われる情報を含む浮動小数点数です。たとえば、AがDürerの

魔方陣であると、

h = plot(A)

は、Aの各々の列に対応する4つのラインをもつラインプロットを作成します。つぎのよ

うなハンドル番号を出力します。

h =

9.00024414062500

6.00048828125000

7.00036621093750

8.00036621093750

実際の数値は、これと異なり、システム毎に変化します。数値が問題ではなく、重要な

ことは、h(1)がプロット内の最初のラインに対するハンドル番号で、h(2)が2番目のライ

ンに対するものということです。

MATLABは、頻繁に使うオブジェクトハンドルにアクセスする関数をいくつか用意してい

ます。

gcf

gca

gco

これらの関数は、FigureやAxesのハンドル番号を必要とする他の関数に対して、入力引

数として使うことができます。作成時ユーザが作成する他のオブジェクトのハンドルも

得ます。オブジェクトを作成するすべてのMATLAB関数は、作成されたオブジェクトのハ

ンドル番号(またはハンドル番号ベクトル)を出力します。

オブジェクトのハンドルを引数として、delete関数と共に使ってオブジェクトを取り除

きます。たとえば、つぎのステートメントでカレント軸(とそれに伴う子オブジェクト)

を削除します。

delete(gca)

オブジェクト作成関数

あるオブジェクトを関数の後に付けて読み込むことにより、これらのオブジェクトの一

つを作成します。たとえば、関数textは、テキストオブジェクトを作成し、関数figure

はFigureオブジェクトを作成します。MATLABの高水準グラフィックス関数(plot,surf等)

は、これらの各々のグラフィックスを描くために適切な低水準関数を読み込みます。

低水準関数は、ルートオブジェクトを除いてMATLABにより定義される11のグラフィック

スオブジェクトの一つを単に作成するものです。そして、それはMATLABのみが作成でき

るものです。たとえば、

line([1 3 6], [8 -2 0], 'Color', 'red')

オブジェクトプロパティ

すべてのオブジェクトは、どのように表示するかを制御するプロパティをもっています。

MATLABは、プロパティ値を設定するための2つのメカニズムを提供しています。オブジェ

クトプロパティは、オブジェクト作成関数で設定され、または既に存在しているオブジ

ェクトに対しては、関数setで変更することができます。たとえば、つぎのステートメン

トは、3つのオブジェクトを作成し、デフォルトプロパティを書き換えます。

days = ['Su';'Mo';'Tu';'We';'Th';'Fr';'Sa']

temp = [21.1 22.2 19.4 23.3 23.9 21.1 20.0];

f = figure

a = axes('YLim',[16 26],'Xtick',1:7,'XTickLabel',days)

h = line(1:7,temp)

daysは週の曜日を表す省略したキャラクタ配列で、tempは代表的な気温の数値配列です。

Figureウィンドウは、引数をもたないfigureを読み込むことで作成され、引数を設定し

ていないのでデフォルト値が使われています。軸はFigureの中に存在して、y軸のスケー

リングに関する設定した範囲と、x軸上の目盛に対して設定したラベルをもっています。

ラインは、軸の中に存在し、xデータとyデータに対して設定された値をもっています。3

つのオブジェクトハンドルf, a, hが、後で使えるように保存されます。

setとget

オブジェクトプロパティは、それを作成した後、オブジェクトを参照して設定されます。

これを行なうために、作成関数により出力されるハンドル番号を使います。

関数setは、オブジェクトハンドル番号と、プロパティ名とプロパティ値の組合せを設定

することにより、オブジェクトのプロパティを設定します。たとえば、前の例題で使わ

れているラインのカラーと幅を変更します。

set(h,'Color',[0 .8 .8],'LineWidth',3)

特定なオブジェクトに対して設定できるすべてのプロパティの一覧を表示するには、オ

ブジェクトのハンドル番号を引数としてsetを使います。

set(h)

Color

EraseMode: [ {normal} | background | xor | none ]

LineStyle: [ {-} | -- | : | -. | none ]

LineWidth

Marker:

MarkerSize

...

XData

YData

ZData

特定のオブジェクトに対してカレントに設定されているプロパティの一覧を表示するた

めには、オブジェクトハンドル番号を引数としてgetを使います。

get(h)

Color = [0 0.8 0.8]

EraseMode = normal

LineStyle =

LineWidth = [3]

Marker = none

MarkerSize = [6]

...

XData = [ (1 by 7) double array]

YData = [ (1 by 7) double array]

ZData = []

プロパティ値を引用するには、プロパティ名を引数としてgetを使います。

get(h,'Color')

ans =

0 0.8000 0.8000

軸オブジェクトは、グラフィックス全体の詳細なプロパティの大部分のものに使われて

います。たとえば、タイトルは、軸の他の子オブジェクトです。ステートメント

t = get(a,'title');

set(t,'String','Temperature','FontAngle','oblique')

は、特定なタイトルを設定します。関数titleは、同じプロパティに対する別のインタフ

ェースです。

グラフィクスユーザインタフェース

つぎに、ユーザインタフェースを作成するためのHandle Graphicsの使い方を示す簡単な

例題を示します。ステートメント

b = uicontrol('Style','pushbutton', ...

'Units','normalized', ...

'Position',[.5 .5 .2 .1], ...

'String','click here');

は、Figureウィンドウの中央にプッシュボタンを作成し、新しいオブジェクトに対する

ハンドル番号を出力します。しかし、ボタンをクリックしない限り、何も機能しません。

ステートメント

s = 'set(b,''Position'',[.8*rand .9*rand .2 .1])';

により、プッシュボタンの位置を変更するコマンドを含んだ文字列を作成します。

eval(s)

を繰り返し実行することにより、ボタンの位置はランダムに変化します。最終的に、

set(b,'Callback',s)

により、sをボタンのコールバックによる挙動として設定します。それで、ユーザがボタ

ンをクリックする度に、新しい位置に移動します。

アニメーション

MATLABには、ム-ビ-、アニメ-ショングラフィックスを作成するいくつかの方法があ

ります。フレームからフレームへの変化が最小となる単純な一連のプロットに対して、

EraseModeプロパティを使うことが適切です。ここで、Brown運動のシミュレーションの

例を示します。点数を

n = 20

そして、つぎのように温度や速度として設定します。

s = .02

これら2つのパラメータに対する最良値は、ユーザが使用するコンピュータのスピードに

依存しています。-1/2と1/2の範囲で(x,y)の座標系でn個のランダムな点を作成します。

x = rand(n,1)-0.5;

y = rand(n,1)-0.5;

一辺が-1から1の正方形内に点をプロットします。点を表すベクトルに対するハンドル番

号を保存し、そのEraseModeにxorを設定します。これは、一つの点の座標が変化したと

き、プロット図全体を書き換えないことを意味しています。また、排他的論理和演算を

使って、一つの点が囲むバックグランドカラーを再ストアします。

h = plot(x,y,'.');

axis([-1 1 -1 1])

axis square

grid off

set(h,'EraseMode','xor','MarkerSize',18)

さて、アニメーションを始めましょう。つぎに示す<ctrl>-cを入力するまで停止しない

無限whileループがあります。ループが繰り返される度に、正規分布するランダムノイズ

が点を表す座標に加えられます。それで、全体が新しいプロットを作成する代わりに、

オリジナルプロットのXDataとYDataプロパティを単に変化させます。

while 1

x = x + s*randn(n,1);

y = y + s*randn(n,1);

set(h,'XData',x,'YData',y)

end

点の一部が正方形の外部に生じるのにどのくらいかかりますか?全ての点が正方形の外

部になるのにどのくらいかかりますか?

ム-ビ-

たとえば、n = 300のように、Brown運動の例題の点数を沢山設定すると、運動は、もは

やスムーズな流動的なものでなくなります。すなわち、個々の時間ステップを描くのに

多くの時間が必要となります。ビットマップとして保存し、ム-ビ-として表示するフ

レームの数を前もって設定することが効果的です。

まず、フレーム数を設定します。たとえば、

nframes = 50

つぎに、EraseModeを使わないこと以外は、前の例題と同じようにして最初のプロットを

作成します。

x = rand(n,1)-0.5;

y = rand(n,1)-0.5;

h = plot(x,y,'.')

set(h,'MarkerSize',18)

axis([-1 1 -1 1])

axis square

grid off

さて、完全なム-ビ-を作成するため十分なメモリを確保します。

M = moviein(nframes)

これは、nframes列をもつ大きな行列を設定します。各列は、一つのフレームを保存する

ために十分な長さをもったものです。必要になるメモリの総量は、フレームの数とカレ

ント軸の大きさに比例します。すなわち、特定なプロットの複雑さには無関係です。50

フレーム、デフォルトの軸に対して、7.5メガバイト以上のメモリが必要になります。こ

の例題は、わずかに小さい正方形の軸を使っています。それで、約6メガバイトで済みま

した。

ム-ビ-を作成し、各々のフレームを取り込むためにgetframeを使います。

for k = 1:nframes

x = x + s*randn(n,1);

y = y + s*randn(n,1);

set(h,'XData',x,'YData',y)

M(:,k) = getframe;

end

最終的に、30回のム-ビ-が表示されます。

movie(30)

更なる使用

MATLABの例題をもっと見たい方は、メニュ-の下のExamplesやDemosを選択するか、

MATLABのプロンプトのもとで、

demo

とタイプインしてください。表示されるメニュ-から、興味のあるデモを、スクリーン

上の説明に従って実行してください。

この本でカバーされているトピックスのより詳細な説明は、つぎのものを参照してくだ

さい。

MATLABのインストレーションについては、MATLAB Installation Guide

MATLAB言語、作業環境、数学的なトピックスについては、Using MATLAB

MATLABのグラフィックスや可視化ツールについては、Using MATLAB Graphics

MATLABとインタフェースをもつCやFortranプログラムの記述法については、

MATLAB Application Program Interface Guide

MATLAB 4.xからMATLAB 5.1への移行についての情報は、MATLAB 5.1 New Features Guide

MATLAB Toolboxは、MATLABの機能を種々のテクニカル分野に拡張したM-ファイルを集め

たものです。Toolbox毎のガイドが役に立ちます。カバーしているトピックスは、つぎの

ものです。

Communications

Control Systems

Financial Computation

Frequency-Domain System Identification

Fuzzy Logic

Higher-Order Spectral Analysis

Image Processing

Linear Matrix Inequalities

Model Predictive Control

Mu-Analysis and Synthesis

Numerical Algorithms

Neural Networks

Optimization

Partial Differential Equations

Quantitative Feedback Theory

Robust Control

Signal Processing

Simulation (Simulink)

Splines

Statistics

Symbolic Mathematics

System Identification

Wavelets

MATLABや他のMathWorksの製品についての最新の情報はWebブラウザで

http://www.mathworks.com

やユーザのニュースグループにアクセスしてください。

comp.soft-sys.matlab

MATLAB関連の多くの書籍が発行されています。これらについては、 MATLAB-Based BooksかWebサイトを参照してください。

この小誌を読み、すべての例題を上手く実行できたなら、MATLABを上手に使いはじめる

ことができます。この最補の節をスキップしたり、または、例題のいくつかを実行しな

い場合でも、Getting Startedを読むのは、あまり時間を必要としません。どちらにして

も、MATLABへようこそ!!!