第5章 MATLAB の基本操作と行列演算
5.1 実験目的
Matlab とは、MATrixLABoratory(行列実験室)の略語で、その名の通り行列操作を得意とするプログラミング言語である。MATLAB は電子・通信・情報などの様々な理工学分野に利用されているだけでなく、産業分野にも幅広く利用されている。本章では、MATLAB によるシミュレーション実験の方法、特に MATLAB 対話形式の環境における MATLAB の操作やファイルの管理、コマンド・関数の利用、データ行列の演算などの基本機能を習得することを目的としている。

5.2 実験内容
5.2.1 MATLAB の基本操作
1. MATLAB の起動と終了
MATLAB を起動するには、デスクトップのアイコンが起動されると、次の初期ウィンドウが開かれる。

5−1をダブルクリックする。MATLAB

初期ウィンドウは異なる機能を持つ複数個のサブウィンドウで構成されている。各サブウィンドウの機能は下記の通りである。
① Command Window：プロンプト>>

で始まり、各種コマンド・関数・プログラムを実行するためのサブウィンドウ。
② Workspace：定義された変数の一覧を表示するためのサブウィンドウ。
③ Current Directory：フォルダやファイルを閲覧するためのサブウィンドウ。
④ Command History：①で実行したステートメントの履歴を表示するためのサブウィンド
ウ。
⑤ Launch Pad：MATLAB に提供されている各種ツールを表示するためのサブウィンドウであるが、初期状態では表示されていない。表示させる場合には、メニューにある 表示(v)から選択して他のサブウィンドウと切替えて表示させることができる。
初期ウィンドウの左下にある スタート というメニューボタンから各種ツール、デモ、ヘルプを起動させることができる。
Matlabを終了するには、Command Window にコマンド >> quitとタイプインする。但し、Matlabを終了させる前に、必要な変数を必ずファイルに保存して下さい。
2. 作業環境とパスの設定
Matlab の作業環境とパスの設定は、原則として参照すべきプログラムをカレントディレクトリに置くことである。この原則のもとで、環境とパスの設定を自由に変更することができる。本実験では次の手順で作業環境とパスを作成する。
(1) 作業用のフォルダの作成
最初の実験日に限り、ハードデスク D:にこれから作業するためのフォルダ MYWORK を新規に作成する。フォルダが既にあった場合にはそのままを利用してもよい。但し、フォルダ MYWORK のなかに他人のファイルがあれば、速やかに削除すること。
(2) パスの設定
Command Window の上のカレントディレクトリの横にあるパス参照ボタン<…>をクリック
し、ハードデスク D:にあるフォルダ MYWORK とリンクさせる。Matlab が再度立ち上がる際に、カレントディレクトリの中から設定したパスを選択する。
(3) ファイルの保存と削除
本実験終了前に、フォルダ MYWORK にあるすべてのファイルを各自が用意したフロッピーディスクか CD に保存し、ファイルの保存を確認した上で、フォルダ MYWORK にあるすべてのファイルを削除する。

5−2

5.2.2 行列の定義と演算
1. 線形代数における行列の定義
n 行 m 列の行列 A を次式のように定義する。

⎡ a11⎢aA = ⎢ 21
⎢ M⎢
⎣a m1

L a1n ⎤
L a 2 n ⎥⎥= (aij )O M ⎥⎥L a mn ⎦a12a 22
Mam2(5-1)

ここで、 a ij (i = 1, L n; j = 1, L m) は行列 A の要素という。式(4-1)において、m=n のとき、行列 A を正方行列と言う。
行列 A の要素が１行しかない場合には、A を行ベクトルと言う。行ベクトルは通常次式のようなボールド体(太字)の小文字で記述する。

a i = [ai1 ai 2 L ain ](5-2)
同様に、行列 A の要素が１列しかない場合には、A を列ベクトルと言う。

⎡ a1 j ⎤⎢a ⎥2j
Ta j = ⎢ ⎥ = a1 j a 2 j L a mj
⎢ M ⎥⎢ ⎥⎣⎢ a mj ⎦⎥[]

(5-3)

上式にある記号Tは転置を意味する。式(4-1)において、m=１且つ n=1 の特別な場合、行列Aの要素は一つだけなので、Aをスカラと言う。
2. MATLAB による行列の定義
MATLAB では、前述のスカラ値、ベクトルと行列データはすべて配列として定義される。
即ち、スカラとベクトルはそれぞれ 1 行 1 列の行列、1 行 n 列（或いは n 行 1 列）の行列として取り扱われる。このような数値行列を定義する際、MATLAB は自動的にデータにメモリを割り当てるので、C 言語のように配列の宣言を行う必要はない。

5−3

例題 5̲1： 次の数値をキーボードから入力し、実行してみよう。なお、例題に使われている二つのセミコロン<;>の役割に注意。
2 行 3 列の行列

行ベクトル>> A = [ 1 2 3 ; 4 5 6 ]>> b= [ 1 2 3 ];A =123456例題 4̲1 においては、セミコロン<;>が左右それぞれ 1 箇所に使われていたが、左の例題の<;>は 1 行目の要素と 2 行目の要素を区切りするために使われている。また、右の例題の<;>は Command Window に実行結果を表示しないために使われている。これらを確認するた
めに、例題にあるセミコロン<;>を外して、もう一度実行して、前の結果と比べてみてください。
例題 5̲2： 転置行列と文字行列を作成しよう。但し、アポストロフィ(apostrophe)<ʼ>の使い方に注意。
行列の転置

文字列の定義>> C = [ 1 2 3 ; 4 5 6 ]ʼ>> d=ʼI like to use Matlab!ʼ

C =d =
142536

I like to use Matlab!

左のアポストロフィ<ʼ>は行列を転置するために使われている。転置の操作 >>C=Aʼ で実行しても同様な結果が得られる。それと対照的に右の二つアポストロフィ<ʼ…ʼ>は文字要素全体を囲んで文字列を定義するために使われている。
3. 行列の保存と読み込み
例題 5̲1 と例題 5̲2 を実行すると Workspace ウィンドウに変数 A、b、C と d が表示される。これとは別に、Workspace にある変数と属性を確認するためには、コマンド whos で実行してもよい。

5−4

>> whos
Name

Size

Bytes

ClassA

2x348

double arrayC3x248

double arrayb1x324

double arrayd1x2142char array

上述の例題から MATLAB では変数名の大文字、小文字を区別されることが判る。
カレントのワークスペース内のすべての変数、或いは一部の変数を保存したい場合には、次のコマンドを実行する。
すべての変数の保存

変数 A, C のみの保存>> save FILENAME>> save FILENAME1 A C

例えば、上記の右を実行すると、変数 A, C が FILENAME1.mat というバイナリ形式の matファイルに保存される。保存されたファイルは、Command Window から >> ls とタイプインして確認することができる。
ワークスペース内の変数の削除、再び変数を読み込みたい場合には、次の操作を行う。

変数 A, C のみの削除

すべての変数の削除>> clear A C>> clearmat-ファイルの読み込み>> load FILENAME1

4. 行列要素の配列操作
MATLAB では、定義されている行列に対して、要素の抽出、置き換え、結合などの操作が容易にできる。これらの操作の注意すべき共通点としては、行列の要素、ベクトル、子行列の行と列の番号（i,j）を正確に指定することである。なお、コロン記号<:>を用いて、行列の初期要素 : 行列の最終要素のようにすれば、ある特定部分の行列要素を取り出すことが簡潔に行える。

5−5ここで、はじめに定義した 2 行 3 列の整数行列 A を再び例にして、次の演習を行う。
>> AA =
12 345 6

例題 5̲3： 配列 A の要素を次のように抽出してみよう。
2 行 1 列目の要素の抽出

1 行目のベクトルの要素の抽出>> a21 = A(2,1)>> a1 = A(1,1:3)

a21 =

a1 =
1 2 34子行列の要素の抽出>> sA = A(1:2,2:3)
sA =
2356

例題 5̲4： 配列Aの要素を次 のように置き換えてみよう。
単一の要素の置き換え

行ベクトルの置き換え>> A(2,2) = 9>> A(2,:) = 7A =

A =
12 3

12 34977 76

子行列の置き換え>> A(1:2,2:3)=[8 0;0 8]
A =180708

例題 5̲5： 鍵括弧 [ ] を使って配列要素を結合してみよう。

5−6ベクトルの結合

スカラの結合>> A12= [a1 ; a2]>> a2 = [a21 a21 a21]

A12 =

a2 =44412 344 4子行列の結合>> AA=[sA sA']
AA =23255636５. 関数による行列の生成単位行列のような基本行列の生成は、MATLAB に内蔵されている関数を利用することで行うことができる。このような行列の生成方法は、サイズが大きな行列に対して特に効率的である。下記の表に主な基本行列の関数名とその説明、実行例を簡単にまとめる。
例題 5̲6： 行列生成の関数や演算子を利用した例題を実行してみよう。
関数名

関数の説明

実行例
>> A=zeros(2,3)

zeros(m,n)

m 行 n 列の零行列の生成

A =000000>> A=ones(2,3)
ones(m,n)

m 行 n 列の要素がすべて 1 であ A =る行列の生成

111111>> A=eye(2)eye(N)

magic(N)N 行 N 列の単位行列の生成

A =1001>> A=magic(3)
魔法陣の生成：行方向、列方向、A =対角方向の和が等しくなる行81列。但し、N = 1,3,4,5,…
3
55−767

492>> A=rand(2,3)
rand(m,n)一様分布の乱数行列の生成

A =0.95010.60680.89130.2311

0.48600.7621>> A=randn(2,2)
randn(m,n)

正規分布の乱数行列の生成

A =-1.1465

1.1892

1.1909-0.0376>> D=diag(randn(2,2))
D =-1.1465diag

対角行列の要素抽出と対角行列を生成するための演算子-0.0376>> A=diag(D)A =-1.14650:colon-0.0376>> t=1:0.5:2
等間隔ベクトルの生成、例えば、t =変数名=初期値: 増分: 最終値
1.0000 1.5000
線形等間隔ベクトルの生成

linspace(x,y,n)02.0000>> linspace(0,100,3)

例えば、x から y までの n 点の ans =0

等間隔ベクトルを作成する

50100>> logspace(0,pi,3)logspace(x,y,n)

対数等間隔ベクトルの生成

ans =1.0000（上記の関数に関する詳しい説明は>> help 関数名

1.77253.1416で参照すること。）

６. 行列と配列の演算
行列および配列という二つの用語は、一般にしばしば混同して使われる。MATLAB では、行列で定義される数学演算は線形代数で取り扱われる内容で、配列で定義される代数演算は要素単位に行われることである。このことは、加算と減算においては、行列演算も配列演算も常に同じ結果が得られるが、乗算と除算を行う場合には、行列演算と配列演算の結果が異なることもあるので、十分な注意が必要である。

5−85.3 実験課題
⎡ a11
⎣a 21

1. 行列 A = ⎢a12 ⎤⎡b11とB = ⎢⎥a 22 ⎦⎣b21b12 ⎤は正則な非零行列である。行列の各要素 a と bb22 ⎥⎦に対して具体的な数値を各自で定義し、MATLAB を利用して次の演算を求めよ。
数値演算子+plus

minus

*
mtimes.*times\mldivide.\
ldivide/mrdivide./rdivide^mpower演算子の説明

数式演算例

加算⎡a + bA + B = ⎢ 11 11⎣a 21 + b21a12 + b12 ⎤a 22 + b22 ⎥⎦減算⎡a − bA − B = ⎢ 11 11⎣a 21 − b21a12 − b12 ⎤a 22 − b22 ⎥⎦行列の乗算⎡ a b + a12 b21
A * B = ⎢ 11 11⎣a 21b11 + a 22 b21

配列(要素毎)の乗算⎡a bA ⋅ *B = ⎢ 11 11⎣a 21b21行列の左除算A \ B = inv ( A) * B ，但し、inv(・)は逆行列演算子

要素毎の左除算

A .\ B = ⎢行列の右除算A / B = A * inv ( B ) ，但し、inv(・)は逆行列演算子

要素毎の右除算

A ./B = ⎢行列のベキ乗⎡ a 2 + a12 a 21A^ 2 = A * A = ⎢ 11⎣a11 a 21 + a 21 a 22

a11b12 + a12 b22 ⎤a 21b12 + a 22 b22 ⎥⎦a12 b12 ⎤a 22 b22 ⎥⎦⎡ b11 ÷ a11 b12 ÷ a12 ⎤⎥⎣b21 ÷ a 21 b22 ÷ a 22 ⎦⎡ a11 ÷ b11⎣a 21 ÷ b21

5−9a12 ÷ b12 ⎤a 22 ÷ b22 ⎥⎦a11 a12 + a12 a 22 ⎤⎥2a12 a 21 + a 22⎦

.^

要素毎のベキ乗power⎡b113 b123 ⎤B.^3 = ⎢ 33 ⎥⎣b21 b22 ⎦2. 三つの正方行列 A, B, C を次のように定義する。

⎡aA = ⎢ 11
⎣a 21a12 ⎤ ⎡− 2 1⎤
⎡b11 b12 ⎤ ⎡− 3 0⎤
⎡ c11=⎢=⎢，B = ⎢，C = ⎢⎥⎥⎥
⎥a 22 ⎦ ⎣4 − 1⎦⎣b21 b22 ⎦ ⎣− 1 2 ⎦⎣c 21c12 ⎤ ⎡1 − 2 ⎤=c 22 ⎥⎦ ⎢⎣3 − 4⎥⎦

行列 A, B, C の各要素を Matlab の Command Window から入力し、次の課題を求めよ。
1) (A+B)C = AC+BC と C(A+B) = CA+CB をそれぞれ手計算し、MATLAB でその計算結果が一致するかを確認せよ。
2) AB と BA が等しくないことを MATLAB の数値計算で示せ。また、行列の交換性 AB=BAが満たされる一例を挙げよ。
3) (AB)T = BTAT，(AT)T = A，(ATA)T = ATA （Tは転置）が成り立つことを数式で証明し、定義した数値を代入して演算せよ。
4) MATLAB の行列演算において、①A.*B ≠ A*B，②A\B ≠ A/B (行列の左除算と右除算)であることを数値例で示せ。
3. Matlabの行列演算の操作方法を用いて次の回路網に流れている電流I1, I2, I3 を求めよ。
但し、回路のパラメータは、E1= 10 [V], E2= 5 [V], R1= 3 [ Ω ], R2= 5 [ Ω ],R3=2 [ Ω ], R4= 1 [ Ω ], R5= 4 [ Ω ],R6= 7 [ Ω ] とする。

E1

R1R2R3I1I2I3R5R4E2R6[ 手順：①回路方程式を立てる。②連立方程式 ⇒ 行列方程式に置換える。③行列演算 ]5−10