Javaで行列式を計算する

Javaで行列式を計算させるのに一番手っ取り早いのはフリーのライブラリを利用することでしょう。ですが、そのようなことができない場合*1、自分でソースコードを書く必要があります。そのことについて、ちょっと前に話に挙がっていたので作ってみました。

public class Matrix {
  // 行列式を求めるメソッド
  public static double det(double[][] args){

    final int size = args[0].length;
    for(int i=0; i<args.length; i++){
      if(args[i].length!=size)
        throw new IllegalArgumentException();
    }

    double det = 0;
    for(int i=0; i<size; i++){
      double rightdown = 1;
      double leftdown = 1;
      for(int j=0; j<size; j++){
        rightdown *= args[(i+j)%size][j%size];
        leftdown  *= args[(i+size-j)%size][j%size];
      }
      det += rightdown - leftdown;
    }
    return det;
  }

  // テストコード
  public static void main(String[] args){
    double[][] matrix = new double[][]{
        {1,2,3},
        {4,5,6},
        {7,8,9}
    };

    System.out.println(det(matrix));
  }
}

これは行列式を計算させる時によく用いられるサラスの方法を実装したものです。引数として配列の配列を渡していますが、この配列のサイズは全て同じでないといけません。また、どちらが行でどちらが列とかそんなことは気にしなくても正しい結果が得られます*2

注意しなければいけないのが、サラスの方法では4次以上の正方行列の行列式は計算できないこと。4次以上の場合は、余因子展開をするなどして次数を落とす必要があります。

ちなみに、このコードはBSDライセンスです。とは言っても、普通に書いても同じようなコードになるんで、適当に利用してやってください。このコードで発生した不具合については、なんら責任を負いません。また、これに基づいたコードについては著作権表示を忘れないようにお願いします*3


(2008/11/24 追記)
Javaのライブラリ、Apache Commons Mathを利用した行列計算の方法についてもまとめてみました。
[blog] Apache Commonsを使って行列計算

(2008/11/24 追記)
余因子展開を用いた行列式の計算を行うJavaコードを掲載しました。
[blog] Javaで行列式計算(余因子展開)

  • *1:たとえば、学生さんのプログラミング演習などの場合
  • *2:これは行列式の定義なんかでも自明ですね
  • *3:誰も、そんなたいそうなことには使わないと思いますが

Track Back

Track Back URL

コメントする

公開されません

refresh captcha

画像の中に見える文字を入力してください。

このページの上部へ

About

tetsuの日記・雑記です。
日々経験したことを記録していきます。

広告

サイト内検索

最近のピクチャ

  • リアディレーラ

月別アーカイブ

最近のコメント