1. MATLAB の基本操作
1.1 起動と終了
MATLAB の起動:
ショートカットアイコンをダブルクリック, あるいは「スタートメニュー」からプログラム-->MATLAB-->R2015b-->MATLAB R2015b を選択する.MATLAB の終了:
Command Window で,quit コマンド,または exit コマンドを実行,あるいは右上の×をクリックする.
1.2 ディスクトップ環境
MATLAB を起動すると,以下のウィンドウが表示される. 各ウィンドウの機能: 1.コマンドウィンドウ 最も頻繁に使用するウィンドウ.ここから各種コマンド・関数・プログラムを実行する. 2.ワークスペース MATLAB 上に定義された変数の一覧を表示する. 3.カレントディレクトリ フォルダやファイルのエクスプローラウィンドウ. 4.コマンド履歴 コマンドウィンドウで実行してきたステートメントの履歴を表示する.1.3 ヘルプの参照
関数やコマンドの使い方,各種機能の使用方法等について情報が欲しいときには,オンラインヘルプ機能を 使う(最も正確な情報が得られる).調べたい情報の内容によって,下記の方法がある. ● ブラウザを開き、MATLAB のオンラインドキュメントを表示する。 https://jp.mathworks.com/help/matlab/index.html ● help コマンドの利用: help 関数名 という形式で実行する. >> help eig eig は,固有値と固有ベクトルを計算します。 (以下,省略)● doc コマンドの利用: doc 関数名 という形式で実行する.Help プラウザで詳細なヘルプが表示される. >> doc eig ● 機能別の関数・コマンド一覧を調べる場合: helpwin コマンドを実行すると各ツールの機能別一覧が Help プラウザに表示される. >> helpwin
2.数値・文字列・行列
MATLAB では,数値と文字の2つのデータタイプを主に扱うことができる. データ型や配列サイズの宣言は不要.2.1 数値の代入
・ a という変数に「5+j3」を代入. ・ 虚数単位として「i」、「j」を認識するので,変数に「i, j」は使用しない方が無難. ・ 変数 A に,変数 a の 5 倍の値を代入.MATLAB では,変数名の大文字・小文字を区別. ・ ステートメントの最後にセミコロンを付けないと Command Window に表示される. ・ 結果を表示したくない場合はセミコロンをつけて実行する.2.2 文字列の作成
・ 文字データを定義する場合は,要素全体をシングルコートで囲む(‘ ‘). >> a = 5 + 3*j a = 5.0000 + 3.0000i >> A = 5 * a A = 25.0000 +15.0000i >> a='text' a = text2.3 行列の作成と操作
・ 要素の全体は,鍵括弧[ ]で囲む. ・ 各要素はブランク,またはカンマで区切る. ・ 各行はセミコロンで区切る. ● 行列の転置: シングルコーテーション( ’ ) を用いる. 関数による行列の定義: zeros ゼロ行列 rand 一様分布する乱数 ones 1 行列 randn 正規分布する乱数 eye 単位行列 linspace 線形等間隔ベクトル diag 対角行列 logspace 対数等間隔ベクトル magic 魔方陣 : 等間隔ベクトル ● 3行2列のゼロ行列 d1 ● 等間隔ベクトル(変数名 = 初期値 : 増分 : 最終値) *変数 pi は円周率が指定されている予約変数 >> B = [ 1 2 3 ; 4 5 6] B = 1 2 3 4 5 6 >> B’ ans = 1 4 2 5 3 6 >> d1 = zeros(3,2) d1 = 0 0 0 0 0 0 >> d2 = -pi:pi/4:pi d2 = -3.1416 -2.3562 -1.5708 -0.7854 0 0.7854 1.5708 2.3562 3.1416● 区間(0.0,1.0)に一様分布する乱数を2行5列のベクトルに格納する d4
2.4 行列の配列操作
MATLAB では定義されている変数に対して,1) 要素の抽出, 2) 要素の置き換え, 3) 行列の結合, を 簡単に実行できる. 1) 要素の抽出 2) 要素の置き換え 3) 行列の結合 >> d4 = rand(2,5) d4 = 0.2476 0.5683 0.8756 0.6531 0.6489 0.1380 0.1834 0.4143 0.6359 0.7692 >> A = [ 1 2 3 4 5; 6 7 8 9 10] A = 1 2 3 4 5 6 7 8 9 10 >> m1 = A(2,3) m1 = 8 >> m2= A(2,:) m2 = 6 7 8 9 10 >> m3=A(2, [2 4]) m3 = 7 9 >> A(2,2)=1 A = 1 2 3 4 5 6 1 8 9 10 >> A(1,:)=10 A = 10 10 10 10 10 6 1 8 9 10 >> m12 = [m1 m2] m12 = 8 6 7 8 9 10 >> m22 = [m12 ; m12] m22 = 8 6 7 8 9 10 8 6 7 8 9 102.5 数値演算
2.5.1 四則演算
+ 加算 .* 要素毎の乗算 - 減算 ./ 要素毎の除算 * 行列の乗算 .\ 要素毎の除算 / 行列の除算(右割り) .^ 要素毎のベキ乗 \ 行列の除算(左割り) ^ 行列のベキ乗 ●行列 A,B の加算・乗算・要素ごとの乗算 >> A = [ 1 2 ; 3 4] A = 1 2 3 4 >> B = [ 4 3 ; 2 1] B = 4 3 2 1 >> C=A+B C = 5 5 5 5 >> D=A*B D = 8 5 20 13 >> E=A.*B E = 4 6 6 42.5.2 初等数学関数とデータ解析関数
初等数学関数は,入力引数で指定した行列の各要素に対して一括して計算を行う. データ解析関数は,行列の各列に対して処理を行う.2.5.3 行列関数
inv 逆行列 lu LU 分解 det 行列式 qr QR 分解 rank 行列のランク eig 固有値 例) 線形代数で基本的な問題である連立方程式の解法. ガウスの消去法による解法と逆行列による解法の例: >> A = [2 3 ; 4 7]; >> b = [5 ; 9]; >> x = inv(A)*b x = 4 -1 >> A¥b ans = 4 -1 inv(A)*b は,A¥b としてもよい.大規模なサイズの行列に対する演算では処理速度や計算精度の面で演算 子「¥」の方が有効. ●代表的な初等数学関数 sin 正弦 exp 指数 log10 対数(10 底) sqrt 平方根 round 最も近い整数へ丸め ●代表的なデータ解析関数 min 最小値 max 最大値 mean 平均値 std 標準偏差 sum 要素の和2.6 比較演算子
A==B A と B は等しい A~=B A と B は等しくない A<B A は B より小さい A<=B A は B より小さいか等しい A>B A は B より大きい A>=B A は B より大きいか等しい 要素同士を比較する場合には比較演算子を使用する.また,要素を抽出したり置き換えたりする場合の条件 判断にも比較演算子が役立つ.この機能によって for 文による繰り返し計算を避けることができる. 比較演算子による実行結果は,0,1で構成されるロジカルデータとなる.つまり,要素が関係式を見たしてい れば1(真)を,満たしていなければ 0(義)を出力する. 例) 比較演算子を利用した要素の抽出と置換 >> A = randn(1,6) A = 0.5377 1.8339 -2.2588 0.8622 0.3188 -1.3077 >> n = abs(A)>= 0.5 n = 1 1 1 1 0 1 >> A1 = A(n) A1 = 0.5377 1.8339 -2.2588 0.8622 -1.3077 >> A(n) = 0 A = 0 0 0 0 0.3188 03. ファイル入出力
ファイルからデータを読み込む際は,インポート関数を使う. ファイルフォーマットに応じて下記のインポート関数がある. load MAT ファイルおよび,ブランク区切りのファイル dlmread 任意の区切り文字で区切られたファイル textread フォーマット付数値,文字を含むファイル xllread Excel スプレッドシードファイル imread 画像ファイル wavread Wave サウンドファイル aviread AVI ファイル2.8 ファイルへの出力
ファイルへデータを出力する際はエクスポート関数を使う. ファイルフォーマットの種類に応じて下記のエクスポート関数がある. save MAT-ファイルおよび,ブランク区切りのファイル d1mwrite 任意の区切り文字で区切られたファイル imwrite 画像ファイル wavwrite Wave サウンドファイル avifile AVI ファイル4. グラフ作成
4.1 2D プロット
関数 y=f(x) をプロットするための MATLAB の関数は,次のようなものがある. plot 線形プロット semilogx x 軸対数プロット semilogy y 軸対数プロット loglog 両対数プロット 関数 y1=f(x1),y2=f(x2)を同時に表示させたいときは,以下のようにと入力する. 3 つ以上の場合も,同様に後ろに続けて記述する.オプション(カラー,ラインタイプ等)は省略可. 表:線種オプション 色(カラー) 線種(ラインタイプ) 点の種類(マーカー) y 黄色 - 直線 . 点 o 丸 m 紫色 : 点線 x クロス + プラス c 水色 -. 一点鎖線 * 星 s 四角 r 赤色 -- 鎖線 d ダイヤ v 下三角 g 緑色 ^ 上三角 < 右三角 b 青色 > 左三角 p 五角形 w 白色 h 六角形 k 黒色 (例) 関数 plot >> x = 0:0.1:6; >> y1 = x+1; >> y2 = (x-2).^2;>> plot(x, y1,'r-o',x, y2,'k+')
5. プログラミング機能
5.1 プログラミングの基本 複数の処理をまとめて実行したい場合や,大規模な処理を段階的に構築したい場合,プログラミング機能を 活用することができる.プログラムは,拡張子: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-ファイル:example01.m の例 <処理内容> 離散時間信号の表示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
% example01.m 連続時間-離散時間信号 clear all; close all; %変数・図のクリアset(0,'DefaultAxesFontName','TimesNewRoman'); set(0, 'DefaultAxesFontSize',16);
set(0, 'DefaultTextFontSize',16);
dummy_fs = 100e3; %ダミーのサンプリング周波数(疑似アナログ表現用) tend = 3; %時刻の範囲設定
t = 0: 1/dummy_fs : tend; %時刻を(1/dummy_fs)間隔で設定
f = 20; %信号の周波数(Hz) xa = cos(2*pi*f*t); %アナログ信号の生成 figure(1); %図番号を1に設定
subplot(2,1,1) %画面を2x1に分割し,位置1に設定 plot(t, xa); %xaを図示
xlabel('Time (Sec.)'); ylabel('Amplitude'); %x,y軸のラベル生成 xlim([0 0.1]); ylim([-1.5 1.5]); %x,y軸の表示範囲設定
fs = 1000; %サンプリング周波数の設定(Hz) n = 0 : 1 : fix(tend*fs); %サンプル点の設定
xd = cos(2*pi*f*n/fs); %離散時間信号の生成
subplot(2,1,2) %画面を2x1に分割し,位置2に設定 stem(n, xd); %xdを図示
xlabel('sample num.'); ylabel('Amplitude'); xlim([0 0.1*fs]); ylim([-1.5 1.5]);
5.2.2. スクリプト M-ファイルの実行 スクリプト M-ファイルを実行するためには,Command Window で単に拡張子(.m)なしでファイル名を入力 するだけ.ツールバーの実行ボタン,あるいは F5 でも実行できる. ●スクリプト M-ファイル:example01.m の実行 >> example01 実行すると上から順番に各行が処理され,アナログ信号と離散時間信号が表示される. なお,実行後の Workspace の変数を確認すると,スクリプト M-ファイルの中で処理された変数がすべて定義 されているのがわかる. 5.3 ファンクション M-ファイル ファンクションは,入力引数をもち,出力引数を出力する M-ファイルです.M-ファイルの名前と関数の名 前は同じものにします.ファンクション M-ファイルは,それ自身がもつワークスペースの中で変数を使い, MATLAB コマンドプロンプトでアクセスするワークスペースと区別します. 5.3.1 ファンクション M-ファイルの例 M-ファイル mean.m の例を示します.ファイルの内容は,次のコマンドで表示できる. >> type mean ファイルの内容: function y = mean(x,dim)
%MEAN Average or mean value.
% For vectors, MEAN(X) is the mean value of the elements in X. For % matrices, MEAN(X) is a row vector containing the mean value of % each column. For N-D arrays, MEAN(X) is the mean value of the % elements along the first non-singleton dimension of X.
%
% MEAN(X,DIM) takes the mean along the dimension DIM of X. %
% Example: If X = [1 2 3; 3 3 6; 4 6 8; 4 7 7]; %
% then mean(X,1) is [3.0000 4.5000 6.0000] and % mean(X,2) is [2.0000 4.0000 6.0000 6.0000].' %
% Class support for input X: % float: double, single %
% See also MEDIAN, STD, MIN, MAX, VAR, COV, MODE. % Copyright 1984-2009 The MathWorks, Inc.
% $Revision: 5.17.4.5 $ $Date: 2010/09/02 13:35:22 $ if nargin==1,
% Determine which dimension SUM will use dim = find(size(x)~=1, 1 );
if isempty(dim), dim = 1; end y = sum(x)/size(x,dim); else y = sum(x,dim)/size(x,dim); end ファンクション M-ファイルの最初の行は,function と言うキーワードで始まります. これは,関数名と引数の順序を与えるものです.この例では,入力引数は,2 つで,出力引数は1です.
5.3.2 ファンクション M-ファイルの実行 MATLAB 関数では,引数の数を可変にできます. これは,通常の他のプログラミング言語の中には見られない,MATLAB 特有のものです. >> A=[1 2 3 4 5]; >> r=mean(A) r = 3 多くの M-ファイルは,この方法で実行します.出力引数を設定しなければ,結果は ans にストアされま す.2 番目の入力引数が設定されなければ,関数はデフォルト値を使って計算する.
【練習1】
以下のスクリプトファイルを実行し,周波数
f を変えると離散時間信号がどのようになるか
色々と試してみよう.例えば,20Hz と 980Hz を試してみる.
% example01.m 連続時間-離散時間信号 clear all; close all; %変数・図のクリア
set(0,'DefaultAxesFontName','TimesNewRoman'); set(0, 'DefaultAxesFontSize',16);
set(0, 'DefaultTextFontSize',16);
dummy_fs = 100e3; %ダミーのサンプリング周波数(疑似アナログ表現用) tend = 3; %時刻の範囲設定
t = 0: 1/dummy_fs : tend; %時刻を(1/dummy_fs)間隔で設定
f = 20; %信号の周波数(Hz) xa = cos(2*pi*f*t); %アナログ信号の生成 figure(1); %図番号を1に設定
subplot(2,1,1) %画面を2x1に分割し,位置1に設定 plot(t, xa); %xaを図示
xlabel('Time (Sec.)'); ylabel('Amplitude'); %x,y軸のラベル生成 xlim([0 0.1]); ylim([-1.5 1.5]); %x,y軸の表示範囲設定
fs = 1000; %サンプリング周波数の設定(Hz) n = 0 : 1 : fix(tend*fs); %サンプル点の設定
xd = cos(2*pi*f*n/fs); %離散時間信号の生成
subplot(2,1,2) %画面を2x1に分割し,位置2に設定 stem(n, xd); %xdを図示
xlabel('sample num.'); ylabel('Amplitude'); xlim([0 0.1*fs]); ylim([-1.5 1.5]);