基本編 - 基礎の行列演算からFFTまで

皆さんこんにちは。皆さんは「MATLAB」を知っていますか? MATLABは多機能がゆえに、その機能や出来ることをすべて理解するのは困難で、使ったことのない人は一体どんなことが出来るツールなのか疑問を持たれているのではないかと思います。この連載記事では、MATLABについて少しでも理解を深めてもらうために、これから何回かに渡ってMATLAB、Simulinkそしてそのオプション製品群について、基本から深いところまで解説していきたいと思います。MATLABをまったく使ったことも触ったこともない方はもちろん、ユーザにも役立つ情報を配信していきたいと思います。

MATLABの生い立ち

MATLABって一体何ができるソフトウェアなのでしょうか? 現在では非常に沢山のことが出来るので、簡潔に言い表すのは困難なのですが、例えばこんなソフトウェアです。

  • 行列演算ができる高機能電卓
  • 数値解析用ソフトウェア
  • 制御系設計・シミュレーションのツール
  • フーリエ変換(FFT)やフィルタ設計ができる環境
  • モデルベース開発で組み込み開発を行うためのプラットフォーム
  • 金融機関がデータ解析に使うソフトウェア

元来MATLABは、米国の研究機関によって開発された線形代数ライブラリ「LINPACK」、「EISPACK」などを基に、商用ソフトウェア化されたもので、アカデミックな出自を持っています。

1950年代、米国や英国ではプログラムで動作するコンピュータの開発が行われるのと並行して、行列演算などの線形代数計算プログラムも同時に開発されていました。まだ、トランジスタが発明されたばかりの頃、ましてやICなど存在しない時代で、コンピュータにはオレンジ色に輝くガラス管のような真空管が入っていて、記憶媒体は紙に穴を空けたパンチカードが使われていた時代です。1960年代に入ると、大学や研究機関でコンピュータサイエンスが研究されるようになり、その成果として1970年代に入ると固有値や固有ベクトルを計算するためのソフトウェアライブラリEISPACKや、行列演算を行うためのLINPACKが作られます。この頃はFortranプログラムで書かれており、後にEISPACKやLINPACKを統合してLAPACK(Linear Algebra PACKage)となりCプログラムに移植されることになります。

これらソフトウェアライブラリにプログラミング環境、グラフィックス機能などを一体化させて、「MATrix LABoratory」を略した名前を冠したMATLABの初期バージョンが生まれました。

それではMATLABの機能について基本的なところを見ていきましょう。

行列やベクトルの演算

MATLABで簡単な行列演算をしてみましょう。

MATLABのコマンドウィンドウで行列を定義するには列方向にスペース( )、行方向にセミコロン(;)で区切ります。

>> A = [1 2; 3 4]
A =
     1     2
     3     4
>> B = [5 6; 7 8]
B =
     5     6
     7     8

データ型を確認してみましょう。

>> whos 
  Name      Size            Bytes  Class     Attributes

  A         2x2                32  double                
  B         2x2                32  double

64ビット浮動小数点型(double)で2x2の行列が定義されました。

AxBの乗算を行うには

>> A * B
ans =
    19    22
    43    50

とすると行列同士の乗算が行われ、ピリオド(.)を演算子の前に付けると要素ごとの乗算が行われます。

>> A .* B
ans =
     5    12
    21    32

また、連続データを作成するときにはコロン(:)を使います。増加ステップが1の場合は初期値と最終値を与えて

>> a = 0:10
a =
     0     1     2     3     4     5     6     7     8     9    10

増減するステップ間隔(-3)を設定したいときには次のように3つの数値を与えます。

>> b = 10:-3:-10
b =
    10     7     4     1    -2    -5    -8

信号処理を行うために、100ポイントの時間軸データを作成するような場合には、まずデータ間隔が1刻みのベクトルを作成(0~99までで100ポイント)してからある値(ここでは1000)で割るか、

>> t1 = (0:99)/1000;

ステップ間隔を1/1000として等間隔ベクトルを作成します。

>> t2 = 0:1/1000:0.099;

ちなみに、データの要素数が多い時には行末にセミコロン(;)を付けるとエコーバックされずに済みます。

ベクトルのサイズを確認すると1 x 100の要素数であることが確認できました。

>> size(t1)
ans =
1   100

また、最終値はインデックス(end)を使って確認してみると、いずれの方法でも同じ値になっていることが確認できました。

>> t1(end)
ans =
    0.0990
>> t2(end)
ans =
    0.0990

次に信号点数はt1と同じ100サンプル分のSin波を生成します。

>> sig = 2*sin(2*pi*20*t1);

さらにXYグラフにプロットします。

>> plot(t,sig), grid on

図のような時間軸応答が表示されました。このように行列演算を行うことが出来ると、プログラムの記述をかなり簡略化することができます。

著者紹介

松本 充史(まつもと あつし)
MathWorks Japan
アプリケーションエンジニアリング部
シニアアプリケーションエンジニア
Mathworks JapanではMATLABの中でも特に信号処理やコード生成に関する機能を担当している