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で行列式計算(余因子展開)
コメントする