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

第42回行列の数学 正方行列

柔道の技には左右があります。右利きの人は右技ばかりを稽古すればよいかというと、そうではありません。右技しかない、と相手にわかれば、相手は警戒して防御しますから技をかけることが難しくなります。試合では、左と見せかけて右、あるいは右と見せかけて左、やっぱり右、と駆け引きをします。実際には左右ばかりではなく8方向の技を交えていくわけで、フェイントをかけたつもりが相手の技の方向にはまって自滅、なんてこともあるのです。どのスポーツでも常に同じ方向、パターンではうまく行かないものです。

今回学ぶ正方行列は、裏に、表にと向きを変える行列です。方程式を解くとき、変数や係数をイコールの左右へ移動させるでしょう。行列の向きを変えるのは、まさにそのような仕事をするためです。今回の学習内容は、行列で方程式を解くための学習で必要な内容です。

図42.1 変幻自在が技を生かす
図42.1 変幻自在が技を生かす

正方行列

行列の行の数と列の数が同じ場合、その行列を正方行列[1]といいます。

行数がnのとき、n次の正方行列といいます。

以下に2次から4次の正方行列の例を示します。

対角行列

n次の正方行列において、左上から右下にかけての一直線に並ぶ成分を対角成分といいます。次の式中で、四角の枠で囲まれた部分が対角成分です。

正方行列のうち、対角成分以外の成分がゼロの場合、その行列を対角行列[2]といいます。

単位行列

対角行列のうち、対角成分がすべて1の場合、その行列を単位行列[3]といいます。単位行列は、特別に記号Eで表されます。

転置行列

行列の行と列を入れ替えたものを転置行列[4]といいます。行と列を入れ替える転置行列は、正方行列に限らず作ることが出来ます。単純に行と列を入れ替えるだけです。

行列の転置行列はと書きます。

特に、が成り立つ正方行列のことを対称行列[5]といいます式42.11、42.12)。-=が成り立つ正方行列を交代行列[6]といいます式42.13、42.14、42.15)。

対角成分以外の値がゼロである対角行列は、転置しても全体として行列の様子が変わりませんから対称行列であることがわかります。

問題 以下に示す関数を作りましょう。

(1) 与えられた行列が正方行列かどうか判定する関数。

(2) 与えられた行列が対角行列かどうか判定する関数。

以下にそれぞれの問題に取り組むためのソースコードを掲載します。不足するコードを補って完成させましょう。ソースはテストの形をとっており、目的の動作をしなければその旨を表示しますが、正常に実行されれば何も起こりません[7]⁠。

ソースコード:Sample isSquareMatrix.java
//サンプルコード
//引数に与えた行列が正方行列か判定する関数。配列版。
//filename : Sample_isSquareMatrix.java

class Sample_isSquareMatrix {

  public static void main(String[] args) {

    int a[][] = //行列A 3x3
      { { 3, 4, 5 },
        { 6, 7, 8 },
        { 9,10,11 } };
    int b[][] = //行列B 3x2
      { { 9,10 },
        { 11,12 },
        { 13,14 } };
    int c[][] = //行列C 4x2
      { { 9,10 },
        { 11,12 },
        { 13,14 },
        { 15,16 } };
    //正方行列でしょうか?
    System.out.println("Test Start");
    test_isSquareMatrix(a,"a",true);
    test_isSquareMatrix(a,"a’",false);
    test_isSquareMatrix(b,"b",false);
    test_isSquareMatrix(c,"c",false);
    System.out.println("Test Done");
  }// end of main

/*
 * test_isSquareMatrix
 * 目的: isSquareMatrix メソッドのテスト
 * 引数: m[][] 判定する行列
 *      valName 引数に渡した行列の変数名
 *      RoH(Result of Hope) 期待される結果
 */
  static boolean test_isSquareMatrix(int m[][],String valName,boolean RoH){
    if (isSquareMatrix(m) == RoH) {
      return true;
    } else {
      System.out.println(valName + "のテストは目的の結果になりませんでした。");
      return false;
    }
  }


/*
 * isSquareMatrix
 * 目的:引数に与えた行列を表す配列が、正方行列かどうか判定する。
 *     行数と一行に入っている要素数が等しいか確認する。
 * 引数: m[][] 判定する行列を表す整数型の二次元配列
 * 戻り値: boolean 正方行列なら真
 */
  static boolean isSquareMatrix(int m[][]){

// ここから 目的のコードを加えましょう。
//
// ここまで

  }

}// end of class Sample_isSquareMatrix
ソースコード:Sample isDiagonalMatrix.java
//サンプルコード
//引数に与えた行列が対角行列か判定する関数。配列版。
//filename : Sample_isDiagonalMatrix.java

class Sample_isDiagonalMatrix {

  public static void main(String[] args) {

    int a[][] = //行列A 3x3
      { { 3, 4, 5 },
        { 6, 7, 8 },
        { 9,10,11 } };
    int b[][] = //行列B 3x2
      { { 9,10 },
        { 11,12 },
        { 13,14 } };
    int c[][] = //行列C 4x2
      { { 9,10 },
        { 11,12 },
        { 13,14 },
        { 15,16 } };
    int d[][] = //行列C 3x3 の対角行列
      { { 1, 0, 0 },
        { 0, 2, 0 },
        { 0, 0, 3 } };
    int zero[][] = //行列Zero 3x3 の零行列
      { { 0, 0, 0 },
        { 0, 0, 0 },
        { 0, 0, 0 } };

    //対角行列でしょうか?
    System.out.println("Test Start");
    test_isDiagonalMatrix(a,"a",false);
    test_isDiagonalMatrix(b,"b",false);
    test_isDiagonalMatrix(c,"c",false);
    test_isDiagonalMatrix(d,"d",true);
    test_isDiagonalMatrix(d,"d’",false);
    test_isDiagonalMatrix(zero,"zero",false);
    System.out.println("Test Done");

  }// end of main


/*
 * test_isDiagonalMatrix
 * 目的: isSquareMatrix メソッドのテスト
 */
  static boolean test_isDiagonalMatrix(int m[][],String valName,boolean RoH){
    if (isDiagonalMatrix(m) == RoH) {
      return true;
    } else {
      System.out.println(valName + "のテストは目的の結果になりませんでした。");
      return false;
    }
  }


/*
 * isSquareMatrix
 * 目的:引数に与えた行列を表す配列が、正方行列かどうか判定する。
 *     行数と一行に入っている要素数が等しいか確認する。
 * 引数: m[][] 判定する行列を表す整数型の二次元配列
 * 戻り値: boolean 正方行列なら真
 */
  static boolean isSquareMatrix(int m[][]){
  //このメソッドは前問(1) の結果を利用してください。
  //対角行列の確認には、正方行列かどうかのチェックも必要です。
  }


/*
 * isDiagonalMatrix
 * 目的:引数に与えた行列を表す配列が、対角行列かどうか判定する。
 * 引数: m[][] 判定する行列を表す整数型の二次元配列
 * 戻り値: boolean 対角行列なら真
 */
  static boolean isDiagonalMatrix(int m[][]){

// ここから 目的のコードを加えましょう。
//
// ここまで

  }

}// end of class Sample_isDiagonalMatrix

解説

以下に、追加する部分のコードを示します。それぞれの行列の判定基準を満たすようにロジックが組まれていることを確認してください。

(1)与えられた行列が正方行列かどうか判定する関数。

ソースコード:Sample isSquareMatrix.java 完成版
/*
 * isSquareMatrix
 * 目的:引数に与えた行列を表す配列が、正方行列かどうか判定する。
 *     行数と一行に入っている要素数が等しいか確認する。

 * 引数: m[][] 判定する行列を表す整数型の二次元配列
 * 戻り値: boolean 正方行列なら真
 */
  static boolean isSquareMatrix(int m[][]){
    int row = m.length; //行数取得
    int cul = m[0].length; //一行目の要素数(列数)の取得
    boolean result = true;
    if (row == cul) {
      for (int i = 0 ; i 

(2) 与えられた行列が対角行列かどうか判定する関数。

ソースコード:Sample isDiagonalMatrix.java完成版
/*
 * isDiagonalMatrix
 * 目的:引数に与えた行列を表す配列が、対角行列かどうか判定する。
 * 引数: m[][] 判定する行列を表す整数型の二次元配列
 * 戻り値: boolean 対角行列なら真
 */
  static boolean isDiagonalMatrix(int m[][]){
    boolean result = true;
    if ( isSquareMatrix(m) ) { // 先ず正方行列であること
      int row = m.length; //行数取得
      int cul = m[0].length; //一行目の要素数(列数)の取得
      for (int i = 0 ; i 

今回はここまで

次回学習する逆行列、そして行列式をクリアすれば、行列を用いて方程式を解くために必要な道具を全て手に入れたことになります。あと少し、頑張ってください。

おすすめ記事

記事・ニュース一覧