MATLABの利用方法
MATLAB/SIMULINKはMathWorks社が開発・販売する商用の数値解析ソフトウェアである.
東海大学ではMATLAB Campus-Wide Licenseを契約しているので,学生・教職員は個人所有のPCに自由にインストールして利用できる.また,一部のコンピュータ室のPCにはあらかじめインストールされている.さらに,オンライン版ならWebブラウザさえあればどこからでも利用できる(事前にMathWorksアカウントの取得が必要).
東海大学湘南キャンパス湘南校舎情報環境のサイトの,「サポート情報」→「ソフトウェアの利用について」→「MATLABの利用について」に詳細が記載されているので,MathWorksアカウントを取得し,必要に応じて個人PCにインストールするとよい.
その他の数値解析ソフトウェアについて
信号解析・制御系設計のためのCADとして無料で利用できる代表的な数値解析ソフトウェアを以下に示す.
-
GNU Octave
MATLABと互換性を持ったフリー(無料)の数値解析ソフトウェアである.MATLABの各種Toolboxに対応するパッケージも有志が開発しており,Octave Packagesとして公開されている. -
Scilab フランスのINRIA(国立情報学自動制御研究所)で開発が開始されたフリーの数値解析ソフトウェアである.GNU OctaveほどMATLABとの互換性はないが,SIMULINKに相当する機能も備えている.
-
Python さまざまな分野で利用出来るオープンソースのプログラミング言語であり,ライブラリ(NumPy, Scipy, Matplotlibなど)を追加することでMATLAB並みの機能が実現出来る.
基本操作
起動
大学コンピュータ室のWindowsPCなら画面下の検索でMATLABを検索して起動する.オンライン版の場合はwebブラウザからMathWorksのサイトにログインして利用する.
カレント・フォルダ
MATLABを起動して開くウィンドウにコマンドを打ち込んでいけば利用はできるが,結果をファイルとして残したり,実験データなとを読み込む場合にはフォルダを意識する必要がある.今現在自分が作業しているフォルダをカレント・フォルダと呼ぶ.
カレント・フォルダを確認するコマンドは,pwd
である.cd
コマンドでカレント・フォルダを移動できるが,面倒なので,ウィンドウ上部のフォルダーツールバーを利用したほうがいい.なお,オンライン版を利用している場合はクラウドストレージであるMATLAB
Drive上にカレント・フォルダがあることになる.必要に応じてPCからファイルをアップロードしたり,PCにダウンロードしたりする.
基本数値・算術コマンド
数値,ベクトル・行列の表現の仕方
MATLAB上でスカラー定数は,
実数:1.6e-31
複素数:1.2+0.8*i (1.2+0.8*jと入力しても良い)
のように入力し,表示もされる.
ベクトル・行列は,
行ベクトル:[1 2 3]
列ベクトル:[1;2;3]
行列:[1 2 3;4 5 6;7 8 9]
のように入力する.要素は実数や複素数,後述の変数(数式)でも構わない.また,要素の区切りはスペース以外にカンマ(,
)でもよい.行列は行ベクトルをセミコロン(;
)で改行しながら入力するというイメージになる.
変数
MATLAB上では,実数,複素数,行列,ベクトルの区別なく変数に格納することができる.変数名は英文字で始まる英数字の文字列で,デフォルトでは大文字小文字の区別をする.
>> b = 1.2e-3
>> A = [1 2*i;3 1 ]
>> w = -2+3*i
現在宣言されている変数名一覧はコマンドwho
で表示される.
>> who
変数:
A ans b w
定義した変数を削除するには,clear
コマンドを使う.引数無しだと,全ての変数をクリアし,
>> clear b w
のように,特定の変数だけをクリアすることもできる.
コマンドライン上での入力と表示
基本的に数値やコマンド・関数をタイプしてenterを押せば,実行される.
>> a = [1 2 3]
a =
1 2 3
標準状態では結果がすぐ表示されるが,行の最後にセミコロン(;
)をつけると表示させないようにすることもできる.
>> a = [1 2 3];
結果が長大なベクトルになる場合が予想されるときなどはセミコロンをつけるとよい.
四則演算,超越関数
四則演算は実数,複素数,行列,ベクトルおよびそれらを内容とする変数に対して実行可能である.ただし,行列の除算A/B
は$S B^{-1}$の意味となる.
sinなどの超越関数も実数,複素数,行列,ベクトルおよびそれらを内容とする変数に対して実行可能であるが,行列,ベクトルに対しては各要素ごとの関数値となる.
>> A = [pi/2 pi;0 pi/6]
>> sin(A)
ans =
1.00000 0.00000
0.00000 0.50000
要素ごとの演算
行列やベクトルの和や差はもちろん各要素ごとの和や差となるが,積や除は行列の積の定義に基づいた計算になる.しかし,場合によっては各要素ごとの積や除をとりたい場合がある.その時は,ピリオド(.
)を演算子の前につける.
>> A = [1 2;3 4]
>> A*A
ans =
7 10
15 22
>> A.*A
ans =
1 4
9 16
行列・ベクトルの操作
要素,行,列,小行列の取り出し
行列およびベクトル内の特定の要素を取り出すには,変数名とカッコを用いて次のようにする.
>> a = [1 2 3;4 5 6;7 8 9]
>> a(2,3)
ans = 6
行列の特定の行や列を取り出すには,要素の取り出しの際に列や行番号の代りにコロン(:
)を使いる.
>> a = [1 2 3;4 5 6;7 8 9]
>> a(2,:)
ans =
4 5 6
小行列を取り出すにはコロンを用いて行もしくは列の範囲を指定する.
>> a = [1 2 3;4 5 6;7 8 9]
>> a(2:3,1:2)
ans =
4 5
7 8
行列の結合
複数の行列やベクトルをまとめて一つの行列にすることができる.ただし,対応する行数や列数は合わせておく必要がある.
>> a = [1;2;3;4];
>> b = [5;6;7;8];
>> c = [a b]
c =
1 5
2 6
3 7
4 8
転置行列
行列やベクトルの転置はシングルコーテーション(’
)を用いる.
>> a = [1 2;3 4];
>> a'
ans =
1 3
2 4
特定の数列からなるベクトルの作成
MATLABの関数では,シミュレーションの時間軸やボード線図の周波数軸などをベクトルで与えることが多い.そのときは,以下の関数を用いると便利である.
等差数列:
linspace(始値,終値,点数)
たとえば,サンプリングタイム0.01で0から0.99までの点数100のベクトルを作るときは以下のようにする.
>> t = linspace(0,0.99,100);
等比数列:
logspace(log(始値),log(終値),点数)
たとえば,$0.01 = 10^{−2}$から$1000 = 10^3$までを対数分割して100点のベクトルを作るとき.
>> omega = logspace(-2,3,100);
なお,等差数列はlinspace
関数を使わなくても次のように:(コロン)だけで作成することもできる.0から1まで0.01刻みで数列を作る場合は以下となる(ただし,ベクトルの点数は101点になることに注意)
>> t = 0:0.01:1;
数値表示のフォーマット
演算結果や変数の内容を表示する桁数を指定できる.標準では5桁の数値で表示される.これでは桁数が少なすぎるとか,指数表示をしてもらいたい時はコマンドformat
で指定する.
>> 10/3
ans = 3.3333
>> format long
>> 10/3
ans = 3.33333333333333
>> format longE
>> 10/3
ans = 3.33333333333333e+00
デフォルトの5桁の表示に戻すには,引数無しでformat
を実行すればよい.なお,これらはあくまで表示上の変更で,内部計算は8バイト(64
ビット)の倍精度浮動小数点値で行われている.
グラフ
plot関数の基本
1次元のベクトルの組を2次元グラフに表現できる.ベクトルX
をx軸,Y
をy軸としてグラフ化するには,plot(X, Y)
とする.
>> X = linspace(0,10,100);
>> Y = sin(X);
>> plot(X, Y)
線の種類や色を変えたいときは,変数の後に続けてシングルコーテーションでくくったフォーマット文字列を追加する.
>> plot(X, Y, 'b+')
この例は,色をblueとし,実線ではなくて+
記号でプロットする.その他の色や線類はhelpで調べられる.
なお,plot関数の引き数としてx軸, y軸, 線の種類を繰り返すことで複数のグラフを重ね書きすることもできる.
>> plot(X1, Y1, 'r-', X2, Y2, 'g-')
その他の装飾
plot
関数でグラフを書いた後,xlabel
, ylabel
,
titile
関数で軸ラベルとタイトルをつけることができる.
>> xlabel('time (s)')
>> ylabel('sin(x)')
>> title('This is a sample graph')
また,グリッド(格子)をつけるには,
>> grid on
を実行すればよい.
プロットの説明(凡例)はlegend
関数で追加できる.特にプロットを複数本重ねる場合は追加すべきである.
>> legend('sin', 'cos')
のようにプロットした順番に指定する.
不要な場合は,
>> legend off
で消すことができる.
また,グラフの表示範囲は自動的に設定されるが,複数のグラフを比較するときなど,一律に範囲を指定すべきである.その場合は,axis
関数を用いる.
>> axis([xmin xmax ymin ymax])
とすることで,x軸, y軸それぞれの範囲を指定できる.
>> axis auto
で再び自動設定に戻る.
対数グラフ
plot
関数のかわりにsemilogx
関数を使うと片対数(x軸だけ対数)のグラフになる.両対数はloglog
関数を用いる.線種の指定などはplot
関数と同じである.
文書への張り込み
グラフをレポートや論文に張り込む場合は,Figureウィンドウの編集メニューから「Figureのコピー」を選べばクリップボードにコピーされるので,それをWordなどのアプリケーション上でペーストすればよい.ただし,オンライン版のMATLABを利用している場合や,印刷に適したベクトル形式の画像フォーマットが欲しい場合は,いったんファイルを経由するほうがよい.その場合はファイルメニューの「保存」で適切なファイル形式を選んで保存する.なお,コマンドウィンドウ上でもprint
コマンドを使うことでファイルに出力できる.
>> print('test.png','-dpng')
一つ目の引数はファイル名で,二つ目はファイルの形式を指定するオプションである.-d
に引き続いて,png
はPNGフォーマットの意味となる.PNG以外のファイルフォーマットはhelp
printで確認できる.
スクリプトファイル
スクリプトファイル(mファイル)とは
これまでのようにコマンドを1行1行打ち込んでいっても作業はできるが,ある程度まとまった処理や繰り返し試行する処理などは,面倒であるし,間違いも見つかりにくい.そこで,その一連の作業をmファイルというテキストファイルとして保存しておくと,実行や修正が非常に楽になる.
mファイルの作成と実行
mファイルはただのテキストファイルなので,MATLAB上のエディタだけでなく,外部の使い慣れたエディタで作成・編集できる.保存する場所は自分のホームフォルダ下に適当な名前のフォルダを作って整理すると良い.
ファイル名は変数名と同じく数字で始まらない英数字とし,拡張子は.m
とする.実行はファイル名から.m
を抜いた部分をコマンドウィンドウ上で入力すればいい.カレント・フォルダにその名前のファイルがあれば実行される.もしくは,MATLABのツールバーのRunボタンを押すことでも実行される.
path
自作のmファイルをあるフォルダにまとめておき,カレント・フォルダがどこであっても,そのmファイルを実行できるようにすることができる.汎用性の高い関数やツールを作り,将来にわたり使いたい場合に便利である.
path
関数によって,現在のコマンド検索pathの表示と変更ができる.
>> path
とすることで現在のpath設定が表示される.これらに,あるフォルダを追加するには以下とする.
>> path(path, '追加したいパス')
この例では,’追加したいパス’で指定したフォルダに自作のmファイルを入れておけば,カレントフォルダがどこであっても実行できるようになる.なお,間違って
>> path('追加したいパス')
とすると,pathが’追加したいパス’
だけになり,自作のコマンド以外は全く実行できなくなるので,注意すること.(一度MATLABを終了して再度起動すれば元に戻る)
データファイルの取り扱い
変数の保存と復元
一旦MATLABを終了して次回続きをやりたいときなど,変数の内容をとっておきたいことがある.スクリプトファイルとして作業手順を保存することはできるが,時間のかかる計算が必要な場合,その度に計算し直すのは面倒である.
このような時,save
コマンドで変数の内容をファイルに保存できる.
>> save data.mat
とすると,カレントフォルダに全変数の内容を保持したファイルが作成される.
このデータを読み込むにはload
コマンドを利用する.
>> clear
>> load data.mat
また,特定の変数を保存するには,以下のように指定する.
>> a = [1 2 3];
>> B = [1 2 3; 4 5 6; 7 8 9];
>> save data.mat a B
しかし,上記の例はMATLABの内部表現(バイナリ形式)であるMATファイル形式での保存であるので,他のアプリケーション(Excelなど)で読み込むことは難しい.そのため,テキスト形式で保存するオプションが用意されている.
>> a = [1 2 3];
>> B = [1 2 3; 4 5 6; 7 8 9];
>> save data.txt a B -ascii
とすれば,ファイルdata.txt
に,変数aとBの内容がアスキー形式(テキスト形式)で書き出される.メモ帳など適当なテキストエディタで内容を確認できるはずである.なお,テキスト形式はバイナリ形式にくらべて精度が低く,ファイルサイズも大きくなることに注意が必要である.
タブまたはスペース区切りのテキストデータの読み込み
実験結果をMATLABで処理したりグラフ化する場合,実験用のプログラム(通常はC言語などで自作する)側はMATLABに渡したいデータをテキスト形式のファイルとして保存するのが簡単である.そこで,タブまたはスペース区切りの数列としてテキストファイルで保存しておき,読み込んだMATLAB側で必要に応じて各変数に切り分けることを考える.
例えば,次のような内容のテキストファイルresult.txt
がカレントフォルダにあるとする.
1 2 3
2 4 6
3 6 9
4 8 12
5 10 15
このファイルを
>> load result.txt
と読み込むことができる.この時,変数名はファイル名から拡張子をとったものとなる.すなわち,この例の場合result
という名前の変数ができる.もし変数名を指定したい場合は,次のように関数形式で記述する.
>> data = load('result.txt');
先のsave
コマンドで保存したMATファイルの読み込みと異なるのは,一度にひとつの変数しか読み込めないことである.しかし全ての変数を別々のファイルに保存するのは面倒であるので,複数の変数の内容を結合して一つの行列としておき,それを一つのファイルに保存して,あとで切り出すようにするのがよい.
例えば,先の例では,1列目が時間t
のデータ,2列目が入力u
のデータ,3列目は出力y
のデータというように3つの変数を一つの行列にまとめてあると考える.この場合,load
した後で次のように列に切り分ければ,3つの変数として分離できる.
>> data = load('result.txt');
>> t = data(:,1);
>> u = data(:,2);
>> y = data(:,3);
他のアプリケーション向けのテキストデータ書き出し
MATLABでのシミュレーションや解析の結果を他のアプリケーション(例えばExcelなどのスプレッドシートgnuplotといったグラフ化ソフトなど)に渡したい時はテキストファイルとして書き出すのが簡単である.
まず,書き出したい変数を結合して一つの変数にしておく.このときサイズ(行数)が揃っていないとエラーになるので,揃えるか,一緒にすることをあきらめて別のファイルにするか決める必要がある.シミュレーション結果などは,時刻ベクトル,入力ベクトル,出力ベクトルなどが同じ行数のはずなので,まとめて1つの行列にできる.
例えば,時刻t
,入力u
,出力y
の3つの列ベクトルを変数out
にまとめてからテキストファイルoutfile.txt
に保存するには以下のようにする.
>> out = [t u y];
>> save outfile.txt out -ascii
なお,テキスト形式での書き出しは,標準では8桁の精度になる.それでは精度が不足する場合は,'-double'
オプションを追加すれば,16桁の精度となる.
>> out = [t u y];
>> save outfile.txt out -ascii -double
MATLABスクリプトのいろいろ
キーボード入力,画面への出力
スクリプト実行中にキーボードから数値や文字列を入力させるにはinput
命令を用いる.同時にメッセージとして表示させる文字列を指定することができる.
画面への出力はC言語と同じくprintf
命令を用いる.
(使用例)
a = input('Please input a: ');
printf('a = %g\n',a);
条件判定
条件判定にはC言語と同じくif
命令が利用できる.ただし,C言語のように括弧で条件式は囲まない.また,中括弧({ }
)は使用せず,end
でif
命令の範囲を指定する.さらに,C言語ではelse
とif
を分けて書くが,MATLABではelseif
と続けて書くこと注意.
(使用例)
a = input('Please input a: ');
if a > 0
printf('a > 0\n');
elseif a > -5
printf('-5 < a <= 0\n');
else
printf('a < = -5\n');
end
繰り返し
while命令
while
命令は条件が成り立っている間,命令群を繰り返す.やはり中括弧は用いずに,命令群の終わりはend
で指定する.なお,中断はbreak
命令である.
while 条件
命令群
end
(使用例)
sum = 0;
while sum < 100
a = input('Please input a: ');
sum = sum + a;
printf('sum = %g\n', sum);
end
for命令
for
命令はC言語のforを限定的にした感じであり,インデックスとする変数の初期値,増分,終値を指定して命令群を繰り返す.命令群の終わりはend
,中断はbreak
なのはwhile
と同様である.なお,増分を省略すると1と解釈される.
for インデックス変数 = 初期値:増分:終値
命令群
end
(使用例)
sum = 0;
for i = 1:2:100
sum = sum + i;
if sum >100
break
end
end
printf('On i = %d, sum = %g\n', i, sum);
初期値:増分:終値という書き方は,ベクトルの作成の表記と同じである.
ユーザ定義関数
スクリプトファイル内でユーザ独自の関数を定義したり,別ファイルで定義したりできる.
同一ファイル内で定義する場合は以下のように記述する.
function [戻値1, 戻値2, ...] = 関数名(引数1, 引数2, ...)
% 関数の説明
命令群
end
MATLABではファイルの末尾に書く必要があり(注:Release 2024a以降ではファイルのどこに書いてもよくなった.ただし,本テキストでは旧バージョンとの互換性を考えてファイルの末尾に書くこととする),Octaveではその関数が呼び出されるより前に記述する必要がある(ただし,ファイルの先頭だと後述のようにファイル名も揃える必要が出てくるので,途中にする必要がある).
function
命令直後のコメント文はhelp
で表示されるので,簡単な説明を入れておくと便利である.
なお,別ファイルで関数を定義する場合は,ファイル名を関数名と同じにした上で,拡張子.m
をつける.関数名は既存の関数とかぶらないように,オリジナルなものになるよう注意が必要である.
また,C言語の関数と同様に,関数内で変数はローカル変数となるので,変数名が同じでも内容は別物となることに注意が必要である.
以下の例は,二つのベクトルの各要素ごとに差をとり,それを各々2乗したものの和を計算する関数の例である.
function err = sqerror(a, b)
% usage: err = sqerror(a, b)
% a: column vector
% b: column vector, same size as a
% err: sum of square errors between a and b
c = a - b;
err = c' * c;
end