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 + 3*j a = 5.0000 + 3.0000i a という変数に 5+j3 を代入. 虚数単位として i j を認識するので, 変数に i, j は使用しない方が無難. 変数 A に, 変数 a の 5 倍の値を代入.MATLAB では, 変数名の大文字 小文字を区別. >> A = 5 * a A = 25.0000 +15.0000i ステートメントの最後にセミコロンを付けないと Command Window に表示される. 結果を表示したくない場合はセミコロンをつけて実行する. 2.2 文字列の作成 >> a='text' a = text 文字データを定義する場合は, 要素全体をシングルコートで囲む ( ).
2.3 行列の作成と操作 >> B = [ 1 2 3 ; 4 5 6] B = 1 2 3 要素の全体は, 鍵括弧 [ ] で囲む. 各要素はブランク, またはカンマで区切る. 各行はセミコロンで区切る. 行列の転置 : シングルコーテーション ( ) を用いる. >> B ans = 4 5 6 1 4 2 5 3 6 関数による行列の定義 : zeros ゼロ行列 rand 一様分布する乱数 ones 1 行列 randn 正規分布する乱数 eye 単位行列 linspace 線形等間隔ベクトル diag 対角行列 logspace 対数等間隔ベクトル magic 魔方陣 : 等間隔ベクトル 3 行 2 列のゼロ行列 d1 >> 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 * 変数 pi は円周率が指定されている予約変数
区間 (0.0,1.0) に一様分布する乱数を 2 行 5 列のベクトルに格納する d4 >> 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 2.4 行列の配列操作 MATLAB では定義されている変数に対して,1) 要素の抽出, 2) 要素の置き換え, 3) 行列の結合, を簡単に実行できる. 1) 要素の抽出 >> 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 2) 要素の置き換え >> 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 3) 行列の結合 >> 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 10
2.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 4
2.5.2 初等数学関数とデータ解析関数 代表的な初等数学関数 sin 正弦 exp 指数 log10 対数 (10 底 ) sqrt 平方根 round 最も近い整数へ丸め 代表的なデータ解析関数 min 最小値 max 最大値 mean 平均値 std 標準偏差 sum 要素の和 初等数学関数は, 入力引数で指定した行列の各要素に対して一括して計算を行う. データ解析関数は, 行列の各列に対して処理を行う. 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 としてもよい. 大規模なサイズの行列に対する演算では処理速度や計算精度の面で演算子 の方が有効.
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 0
3. ファイル入出力ファイルからデータを読み込む際は, インポート関数を使う. ファイルフォーマットに応じて下記のインポート関数がある. load dlmread textread xllread imread wavread aviread MAT ファイルおよび, ブランク区切りのファイル 任意の区切り文字で区切られたファイル フォーマット付数値, 文字を含むファイル Excel スプレッドシードファイル 画像ファイル Wave サウンドファイル AVI ファイル 2.8 ファイルへの出力ファイルへデータを出力する際はエクスポート関数を使う. ファイルフォーマットの種類に応じて下記のエクスポート関数がある. save d1mwrite imwrite wavwrite avifile MAT- ファイルおよび, ブランク区切りのファイル 任意の区切り文字で区切られたファイル 画像ファイル Wave サウンドファイル AVI ファイル
4. グラフ作成 4.1 2D プロット関数 y=f(x) をプロットするための MATLAB の関数は, 次のようなものがある. plot semilogx semilogy loglog 線形プロット x 軸対数プロット y 軸対数プロット 両対数プロット 関数 y1=f(x1),y2=f(x2) を同時に表示させたいときは, 以下のようにと入力する. 3 つ以上の場合も, 同様に後ろに続けて記述する. オプション ( カラー, ラインタイプ等 ) は省略可. >> plot(x1,y1, カラーラインタイプマーカー,x2,y2, カラーラインタイプマーカー,...) 表 : 線種オプション色 ( カラー ) 線種 ( ラインタイプ ) 点の種類 ( マーカー ) 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 % example01.m 連続時間 - 離散時間信号 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 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; f = 20; xa = cos(2*pi*f*t); figure(1); subplot(2,1,1) plot(t, xa); % 時刻の範囲設定 % 時刻を (1/dummy_fs) 間隔で設定 % 信号の周波数 (Hz) % アナログ信号の生成 % 図番号を 1 に設定 % 画面を 2x1 に分割し, 位置 1 に設定 %xa を図示 xlabel('time (Sec.)'); ylabel('amplitude'); xlim([0 0.1]); ylim([-1.5 1.5]); fs = 1000; n = 0 : 1 : fix(tend*fs); xd = cos(2*pi*f*n/fs); subplot(2,1,2) stem(n, xd); %x,y 軸のラベル生成 %x,y 軸の表示範囲設定 % サンプリング周波数の設定 (Hz) % サンプル点の設定 % 離散時間信号の生成 % 画面を 2x1 に分割し, 位置 2 に設定 %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]);
練習 2 以下のスクリプトファイルを実行し, 信号点の数 N を変えると, スペクトルがどのように変わるか色々と試してみよう. ただし, スクリプトファイルと同じフォルダにファンクションファイル (dft.m と idft.m) を作成しておくこと. % example02.m DFT/IDFT ここに example01.m の内容をコピーする st = 1; % 信号切り出しの始点 N = 50; % 解析する信号点の数 [DFT_X] = dft(xd(st:st+n-1)); %DFT [idft_x] = idft(dft_x); %IDFT figure(2) %stem((0:n-1), abs(dft_x)); xlabel('k'); ylabel(' X(k) '); stem((0:n-1).*fs/n, abs(dft_x)); xlabel('frequency (Hz)'); ylabel(' X(f) '); figure(3) stem(n, xd, 'b'); hold on stem((0:n-1), real(idft_x), 'r'); xlabel('sample num.'); ylabel('amplitude'); axis([0 250 1.1*min(xd) 1.1*max(xd)]);
%dft.m DFT 計算用ファンクション M- ファイル function [ X ] = dft(signal) N = length(signal) for k = 1 : N x = 0; for n = 1 : N xx = signal( n ) * exp((-2j * pi * (n - 1) * (k - 1))/ N ); x = x + xx; end X( k ) = x; end %idft.m IDFT 計算用ファンクション M- ファイル function [ ix ] = idft(x) N = length(x) for n = 1 : N yy = 0; for k = 1 : N y = X( k ) * exp((2j * pi * (n - 1) * (k - 1))/ N ); yy = yy + y; end ix( n ) = yy; end ix = ix/n;