はじめMath! Javaでコンピュータ数学

第40回 行列の数学 行列の加減算

この記事を読むのに必要な時間:およそ 3 分

問題:行列の減算を行う関数を作りましょう。

整数を成分として持つ行列の減算メソッドを,配列を用いて作ってください。問題を簡単にするために,行列は2×2に限定します。次元の異なるもの同士の計算を行おうとした場合は標準出力に「演算できません」と表示し,強制終了するようにしましょう。連載第38回の問題の解答を修正し,一般的な行列の減算を行うメソッドにしましょう。

メソッドはvSubMatrix(A,B,C)のように呼び出しましょう※1⁠。行列Aと行列Bの差を行列Cに格納してください。

※1)
引き算は名詞でsubtraction。動詞でsubtractです。

解説

行列の減算は,連載第38回の解答を少々変更すれば実現できます。参考に解答例を示します。

ソースコード:HairetsuDeMatrixSub.java

///サンプルコード
//行列の差をとる。配列版。
//filename : HairetsuDeMatrixSub.java

class HairetsuDeMatrixSub {

  public static void main(String[] args) {

    int a[][] = //行列A
      { { 3,4 },
        { 5,6 } };
    int b[][] = //行列B
      { { 1,2 },
        { 3,4 } };
    int c[][] = new int[2][2]; //行列C

    //C = A - B
    vSubMatrix(a,b,c);
    //結果表示
    for( int i = 0 ; i < a[0].length ; ++i ){
      for(int j = 0 ; j < a[1].length ; ++j ){
        System.out.println("a["+i+"]["+j+"] - " +
                           "b["+i+"]["+j+"] = c["+i+"]["+j+"]");
        System.out.println(a[i][j] + " - " + b[i][j] + " = "+ c[i][j]);
      }
    }
  }// end of main

  static void vSubMatrix(int a[][], int b[][], int c[][]){
    if (a[0].length == b[0].length &
        a[1].length == b[1].length){
      //減算可能
      for( int i = 0 ; i < a[0].length ; ++i ){
        for(int j = 0 ; j < a[1].length ; ++j ){
          c[i][j] = a[i][j] - b[i][j];
        }
      }
    } else {
      //減算不能
      System.out.println("減算できません");
      System.exit(0);
    }
  }

}// end of class HairetsuDeMatrixSub

今回は問題を簡単にするために2×2の行列に限りました。しかし,任意の行列の減算を行うプログラムを実際に考えると,とたんに複雑になります。発展課題として任意の行列に対応するものを考えてみられてはいかがでしょうか。

今回はここまで

今回は行列の一般的な形を学びました。前回まで学んできた「ベクトル」は,1行だけ,あるいは1列だけという特別な場合です。

行列を用いると,用いない場合に比べて大変シンプルに式を表現できます。ものごとをシンプルに表現できるというのは大変なメリットです。その他の単純に出来ないことを考えるために集中できます。そして,行列の計算は単純な約束の繰り返しです。単純な約束事の繰り返しは,コンピュータの得意とするところ,コンピュータがまさに長所を生かせる分野なのです。

今回のまとめ

  • 行列の横方向の並びを行,縦方向の並びを列といいます。
  • 行列の数学は,コンピュータの数学の主役級です。

コラム Matrix

1999年公開の映画,『The Matrix』をご記憶でしょうか。劇中では,人間はロボットにより,生まれた直後からケーブルに接続され,発電のために生かされ,その思考は「マシン・シティ」の中央コンピュータ上で走っているソフトエウア「Matrix」に支配されているのです・・・。そんなショッキングなストーリーと,キアヌ・リーブス,キャリー・アン・モス,そしてローレンス・フィッシュボーンといった個性派俳優達のアクションが魅力的な映画でした。いまだにあの弾丸を避けるシーンが鮮やかに思い出されます。

映画のタイトル,『The Matrix』は,数学の言葉としては「行列」を表しています。また,コンピュータの言葉としては,多くのコンピュータが整然と接続されたものを意味します。辞書によるとマトリックスという言葉は,生物やシステムの発生・成長・生成に用いられる「母体,基盤」といった意味にも用いられるそうです。(プログレッシブ英和中辞典(小学館)より)

劇中で登場した,原子力発電所や化学工業プラントを思わせる高層建築物へ無数に接続された人間が納められた赤いチューブ。このシーンは,まさに行と列に整然と並べられた「Matrix」を思わせますし,実際に映画の中では人間の生存を支える母体・基盤でした。この発電システムを制御するシステムがMatrixと言う名前であるのは,大変合理的です。

『The Matirx』三部作では,対立する機械と人間達は結局どちらも勝利せず,人間側と機械側がひとときの和平を結ぶというものでした。優位に立っているのが機械であることは変わりません。考えれば考えるほど,なんだかすっきりしないストーリーです。この作品を,現実世界の風刺ととらえれば,私たちは既に切っても切れないほどにコンピュータに支配されているもの,と考えることが出来ないでしょうか。

現実のMatrixの数学,行列の数学は大変シンプルです。私たちはMatrixに支配されるのではなく,Matrixを上手に使いこなしていこうではありませんか。

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。2010年のLotYはRuby。結城浩氏のような仕事をしたいと妄想する30代後半♂。