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

第41回 行列の数学 行列のスカラ倍と乗算

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

問題:行列の乗算を行うメソッドを作りましょう。

整数を成分として持つ行列の乗算メソッドを,配列を用いて作ってください。

メソッドはサンプルコードに示すようにvMultiMatrix(A,B,C,i,j,k,l)のように呼び出しましょう※2)⁠行列Aと行列Bの積を行列Cに格納してください。引数の意味についてはソースコードをご覧下さい。

問題を簡単にするために,乗算メソッドで引数の次元数をチェックしなくて結構です。代わりに,メソッドを呼ぶ際に,与えた行列の次元を渡します。これで,ずいぶん簡単になったはずです。

コードを組む前に,一度小さな行列を手で計算し,そのステップを紙の上で確認してみましょう。自分が今,どの行列の何行目・何列目を計算しているのかをしっかりととらえましょう。それが出来たら,コードに置き換えるのです。

ソースコード:HairetsuDeMatrixMultiplication.java

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

class HairetsuDeMatrixMultiplication {

  public static void main(String[] args) {

    int a[][] = //行列A 2x3
      { { 3,4,5 },
        { 6,7,8 } };
    int b[][] = //行列B 3x2
      { { 9,10 },
        { 11,12 },
        { 13,14 } };
    int c[][] = new int[2][2]; //行列C


    //C = A x B
    vMultiMatrix(a,b,c,2,3,3,2);
    //結果表示
    for( int Rc = 0 ; Rc < 2 ; ++Rc ){ //Rc means Row C
      for(int Cc = 0 ; Cc < 2 ; ++Cc ){ //Cc means Culumn C
        System.out.println("c[" + Rc + "][" + Cc + "] = "+ c[Rc][Cc]);
      }
    }
  }// end of main

/*
 * vMultiMatrix
 * 目的:二つの行列の積を求める。
 *       問題を簡単にするために,厳密に行列の次元チェックはしない。
 * 引数  i,j  配列A の行数,列数
 *       k,l  配列B の行数,列数
 * このとき,j=k でなければ乗算できない。
 * 戻り値を格納する行列C の行数・列数はi,l でなければならない。
 */
  static void vMultiMatrix(int a[][], int b[][], int c[][],
                           int i, int j, int k, int l){
// ここから 目的のコードを加えましょう。
//
// ここまで
  }
  
}// end of class HairetsuDeMatrixMultiplication
※2)
掛け算は名詞でmultiplication。動詞でmultiplyです。

解説

式41.9をいきなりコードに置き換えようとしても,どこから手をつけて良いのか困ってしまったことでしょう。ところが,紙と鉛筆の上で解いた手順を確認しながらコードに置き換えてみると,不思議と簡単にコーディング作業出来てしまうものです。アルゴリズムを紙の上で追いかけることは,思考を助けるためにとても有効なのです。

ソースコード:HairetsuDeMatrixMultiplication.java の不足部分

  static void vMultiMatrix(int a[][], int b[][], int c[][],
                           int i, int j, int k, int l){
    for( int Rc=0; Rc < i; ++Rc){
      for (int Cc=0; Cc < l; ++Cc) {
        for( int m = 0 ; m < j ; ++m){
          c[Rc][Cc] = c[Rc][Cc] + a[Rc][m]*b[m][Cc];
        }
      }
    }

  }// end of static void vMultiMatrix

今回はここまで

今回は行列のスカラ倍と行列の乗算について学びました。行列の乗算では,⁠可換でない」という新しい概念を学びました。式をシンプルに記述するために考えられた行列ですが,乗算では可換でないという足かせもあるわけです。確かに重い足かせですが,これをうまく回避したり,足かせを受けてあまりあるメリットがあるわけですから,へこたれることなく学び続けましょう。

今回のまとめ

  • 行列の乗算では交換法則が成り立ちません。
  • 次元数の多い行列の計算はコンピュータなしには考えられません。

著者プロフィール

平田敦(ひらたあつし)

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