植松研究室 MATLABゼミ 第1回

植松研究室で多用されるソフトウェア「MATLAB®」の理解を深めよう!

Contents

MATLABとは

MATLABとは数値解析ソフトウェアであり,その中で使われるプログラミング言語の呼称でもある。FortranやC言語のようなコンパイラ形式(ソースコードをコンパイルして機械が読めるように変換してから実行する形式)ではなく,インタプリタ形式(ソースコードを直接実行して,逐次機会読めるようにする形式)であるので,若干計算速度は劣るものの,「分かりやすい,取っつきやすいコード作成」,「デバッグが容易」,「一部だけコードを走らせる」,「型宣言不要」といったメリットがあり,柔軟なプログラミング作業が可能である。

特に,FortranやC言語のようなプログラミング(アルゴリズム開発)だけではなく,グラフ作成といったデータの可視化や,信号処理のようなデータ解析などが容易に行うことができることが強みとして挙げられる。

MATLABで出来ること

・行列演算 ・グラフの描画 ・信号処理(フーリエ変換等) ・プログラミング

⇒最初の方は超高機能なExcelのようなものだと思うと分かりやすい…?

植松研究室とMATLAB

【膨大なデータ処理】

例えば風洞実験では,風向毎にデータがあるのでデータ量が膨大になる。そのような膨大なデータをプログラミングで一気に処理することができる。(他のプログラミング言語でももちろん可能だが,MATLABの強みはこれから…!)

【グラフの作成】

膨大なデータ処理をして得られた時刻歴データを,MATLAB上でそのままグラフに。

【コンター図の作成】

風圧分布などのコンター図の作成にもMATLABは活躍する。植松研に初めてMATLABをインストールしたのはコンター図を描くためである。

【パワースペクトルの計算(グラフの描画)】

信号処理のオプションツールが入っているので,フーリエ変換などを要するパワースペクトルの計算なども楽々(?)可能である。
MATLABは組み込み関数(例えば,max,minなど)が充実しているため,それらを組み合わせることで容易に計算プログラムを作成することが可能である。

【マトリクスによる計算】

MATLABは行列計算(マトリクス計算)を得意とする。多次元配列による計算を容易に行うことができるため,FortranやC++などのループ計算によるケアレスミスを減らすことが可能となる。

【プログラム作成の容易さ】

他のプログラミング言語と比べ,プログラムのエラーの原因をはっきり説明してくれる。コンパイルエラーが無い分,プログラム作成の難易度は格段に容易である。

MATLABを動かしてみよう

【変数の作成,演算,削除】 コマンドウィンドウへの入力で,変数の作成や演算ができます。

数式の直接入力

2*2
ans =

     4

⇒ans=4という計算結果が表示される。これは結果的に,ansという変数を作成したことになる。

変数の作成

1 変数の作成結果を表示したい場合

下記のように演算を行うと,計算結果が出力される。
a=2*2
a =

     4

⇒a=4という計算結果が表示され,a=4という変数が作成される。

2 変数の作成結果を表示せずに変数を作成したい場合

最後に *;* を付けると,計算結果は表示されない。
a=2*2;
⇒セミコロンを入れたことで計算結果は表示されないが,a=4という変数が作成されている。

3 複数の変数の作成

同時に複数の変数を作成することができる。
a=2*2; b=5;
改行,カンマ,セミコロンで区切る

4 変数の上書き

既に作成した変数と同じ名前で変数を作成しようとすると,上書きされる
b=10;

演算

1 変数を使った演算

変数を使って演算ができる
c=a*b;
d=a/b;
e=a*b*2;

2 変数への代入

変数に変数を代入することができる
f=b
f =

    10

変数の削除

1 指定した変数の削除

clearという関数を用いて指定した変数を削除することができる
clear b c d

2 全ての変数の削除

clearの後に何も指定しないと,全ての変数が削除されます
clear

3 指定以外の変数の削除

clearvars -exceptを用いることで,指定の変数以外の変数を削除できます
clearvars -except a

コマンドウインドウの履歴の削除

コマンドウインドウに表示されている履歴を消すことが出来ます。履歴は後から呼び戻しが可能です。
clc

行列の作成・演算

【行列による計算】

MATLABは, MATrix LABratoryの略であるように,行列演算に長けたソフトウェアである。
これまでは1つの変数に対して1つの数字を入れて扱ってきたが,行列として変数を扱う方法を紹介する。

行列の作成

1 行列の作成1

1行3列の行列作成
A=[1 2 3];

$$A=\pmatrix{1 & 2 & 3}$ という1行3列の行列が作成され,Aに格納される。

2 行列の作成2

3行3列の行列作成
B=[1 2 3; 4 5 6; 7 8 9];

$$B=\pmatrix{1 & 2 & 3 \cr 4 & 5 & 6 \cr 7 & 8 & 9}$ という3行3列の行列が作成され,Bに格納される。

行列の演算

1 行列の演算1

行列の積
C=A*B;

$$C=AB=\pmatrix{1 & 2 & 3}\pmatrix{1 & 2 & 3 \cr 4 & 5 & 6 \cr 7 & 8 & 9}$ を計算して,Cに格納している。

行列の積のルールがあるので, $$C=BA$は出来ない。

2 行列の演算2

行列の積と行列要素同士の積
D=[9 8 7; 6 5 4; 3 2 1;];
E=B*D;
F=B.*D;

$$E=BD=\pmatrix{1 & 2 & 3 \cr 4 & 5 & 6 \cr 7 & 8 & 9}\pmatrix{9 & 8 & 7 \cr 6 & 5 & 4 \cr 3 & 2 & 1}$

$$F=\pmatrix{1*9 & 2*8 & 3*7 \cr 4*6 & 5*5 & 6*4 \cr 7*3 & 8*2 & 9*1}$

演算記号の前に「.」を打つことで,要素同士の計算ができる

行列から値の抽出

1 値の抽出1

g=B(2,2);

行列Bの2行2列目の値をgに格納します。

2 値の抽出2

h=F(:,1);

行列Fの1列目の値をhに格納します。

「:」はその列(行)全部を示す。

3 値の格納

I(:,1)=E(:,1);
I(:,2)=F(:,3);

行列Iの1列目に行列Eの1列目の値を格納し,

行列Iの2列目に行列Fの3列目の値を格納します。

行・列の番地を指定して代入しているので,上書きされることはありません。

変数の保存,読み出し(matファイル)

1 変数の保存

save('test.mat');

ワークスペースに入っている変数(行列)を,test.matというファイルに保存します。保存先は 現在のフォルダー です。

2 変数の読み出し

load('test.mat');

test.matを読み込みます。現在のフォルダーの位置が合ってないと,読みだせません。

3 現在のフォルダー(ディレクトリ)の移動

cd('C:\Users\konno\Desktop\matlab_seminar\2016\第1回');

開きたいファイルのフォルダ,保存先のフォルダを指定したいときは,ディレクトリ(今いるフォルダ)を移動先を指定します。

mファイルの作成,実行

MATLABで複数の命令を同時に実行したい場合,m-ファイルを使う。m-ファイルとは,他のプログラミング言語のように複数の命令を記述したテキストファイルである。
m-ファイルを使うと,コマンドウインドウで実行していた命令を連続して実行できる。
m-ファイルは普通のテキストファイルであり,ワード等の適当なエディタを使って作成することができるが,MATLABにはエディタが含まれている。

P_sample.m を開いて実行してみよう。

MATLABウィンドウ上の実行ボタンか,F5を押すことで実行できる。

for文

forは,for文内に記述されるものを指定回数繰り返し実行する。
適当なmファイルを作成し,以下のコードを打ち込んでみよう。
clear
clc

X=2;
Y=1;
Y1=0;

for i=1:10
Y1=Y*X;
Y=Y1;
end
【参考】forループはプログラミングを行う上で非常に重要であるが,MATLABにおいてはforを使わずに行列計算で済ませられる場合は,計算速度が速くなる。

if文

ifは,指定した条件に合った場合に,if文内に記述されるものを実行します。
適当なmファイルを作成し,以下のコードを打ち込んでみよう。
clear
clc


X=0;
Y=0;
Z=0;

D=[42 55 69 54 32 66 50 49];

for i=1:length(D);

if D(1,i)<50
X=X+1;
elseif D(1,i)>50
Y=Y+1;
else
Z=Z+1;
end
end

課題

入力データ「 input.mat 」は,低層建物を対象とした風洞実験から得られた,屋根面に作用する内圧の風圧係数時刻歴である。風洞実験はサンプリングレート500Hzで行われた。

1度の測定から得られたデータは16384個であり,統計値算出の為に同じ測定を5回行ったため,16,384×5の2次元行列となっている。(各測定回の風圧係数時刻歴を $$C_{pi1}-C_{pi5}$ と呼ぶこととする。)

$$C_{pi1}-C_{pi5}$の平均値,最大値,最小値,標準偏差,変動係数を求めるプログラムを記述しなさい。求められた統計値は,「answer1」と呼ばれる変数に,以下の順番で格納すること。

但し,MATLABに組み込まれている関数(max関数やsum関数等)は用いず,条件文と四則演算のみを用いること。

締切:4月某日

参考文献