Javaで線形代数の行列演算をする際、
Apache Commonsの「Commons Math」を使うと簡単だったので、
基本的な行列演算をしてみたものをまとめました。

Commons Math: Apache Commons Mathmatics Library
 http://commons.apache.org/proper/commons-math/

ライブラリは上記サイトからダウンロードしてCLASSPATHを通して下さい。
今回利用したバージョンは3.2、
「commons-math3-3.2.jar」というファイル名のものです。

線形代数関連のクラスは
「org.apache.commons.math3.linear」パッケージに入っています。
リファレンスは以下を参照して下さい。
 http://commons.apache.org/proper/commons-math/apidocs/index.html

説明書こうかとも思ったんですが、見れば分かるので、
以下にコードと実行結果だけ載せておきます。

LinearAlgebra.java:


import org.apache.commons.math3.linear.EigenDecomposition;
import org.apache.commons.math3.linear.MatrixUtils;
import org.apache.commons.math3.linear.RealMatrix;

/* 線形代数の行列演算 */
public class LinerAlgebra {

public static void main(String[] args) throws Exception {
// 行列の定義
System.out.println("**** 行列の定義");
RealMatrix matrix1 = MatrixUtils.createRealMatrix(new double[][]{{1, 0, -4}, {2, -3, -1}});
System.out.println("行列A: " + matrix1);
System.out.println("Aの転置行列: " + matrix1.transpose());
RealMatrix zeroMatrix = MatrixUtils.createRealMatrix(2, 2);
System.out.println("ゼロ行列: " + zeroMatrix);
RealMatrix identityMatrix = MatrixUtils.createRealIdentityMatrix(2);
System.out.println("単位行列: " + identityMatrix);

// 行列の和とスカラー倍
System.out.println("\n**** 行列の和とスカラー倍");
RealMatrix matrixA = MatrixUtils.createRealMatrix(new double[][]{{1, 0, -4}, {2, -3, -1}});
RealMatrix matrixB = MatrixUtils.createRealMatrix(new double[][]{{-3, 4, 8}, {1, 5, -2}});
System.out.println("行列A: " + matrixA);
System.out.println("行列B: " + matrixB);
System.out.println("A+B: " + matrixA.add(matrixB));
System.out.println("A-B: " + matrixA.subtract(matrixB));
System.out.println("3A: " + matrixA.scalarMultiply(3));
System.out.println("A-2B: " + matrixA.subtract(matrixB.scalarMultiply(2)));

// 行列の積
System.out.println("\n**** 行列の積");
RealMatrix matrix2A = MatrixUtils.createRealMatrix(new double[][]{{3, -3, 1}, {0, -2, 4}});
RealMatrix matrix2B = MatrixUtils.createRealMatrix(new double[][]{{-1, 0}, {5, 1}, {0, -3}});
System.out.println("行列A: " + matrix2A);
System.out.println("行列B: " + matrix2B);
System.out.println("AB: " + matrix2A.multiply(matrix2B));

// 逆行列
System.out.println("\n**** 逆行列");
RealMatrix matrix3A = MatrixUtils.createRealMatrix(new double[][]{{1,2},{3,4}});
System.out.println("行列A(正則行列): " + matrix3A);
System.out.println("Aの逆行列: " + MatrixUtils.blockInverse(matrix3A, 0));
RealMatrix matrix3B = MatrixUtils.createRealMatrix(new double[][]{{4,2},{6,3}});
System.out.println("行列B(正則行列ではない): " + matrix3B);
System.out.println("Bの逆行列: " + MatrixUtils.blockInverse(matrix3B, 0));

// 行列式、固有値と固有ベクトル
System.out.println("\n**** 行列式、固有値と固有ベクトル");
RealMatrix matrix4A = MatrixUtils.createRealMatrix(new double[][]{{1,-2},{3,-4}});
EigenDecomposition ed = new EigenDecomposition(matrix4A);
System.out.println("行列式: " + ed.getDeterminant());
double[] eigens = ed.getRealEigenvalues();
for(int i=0; i<eigens.length; i++) {
System.out.println("固有値: " + eigens[i]);
System.out.println("固有ベクトル: " + ed.getEigenvector(i));
}
}
}

実行結果:


**** 行列の定義
行列A: Array2DRowRealMatrix{{1.0,0.0,-4.0},{2.0,-3.0,-1.0}}
Aの転置行列: Array2DRowRealMatrix{{1.0,2.0},{0.0,-3.0},{-4.0,-1.0}}
ゼロ行列: Array2DRowRealMatrix{{0.0,0.0},{0.0,0.0}}
単位行列: Array2DRowRealMatrix{{1.0,0.0},{0.0,1.0}}

**** 行列の和とスカラー倍
行列A: Array2DRowRealMatrix{{1.0,0.0,-4.0},{2.0,-3.0,-1.0}}
行列B: Array2DRowRealMatrix{{-3.0,4.0,8.0},{1.0,5.0,-2.0}}
A+B: Array2DRowRealMatrix{{-2.0,4.0,4.0},{3.0,2.0,-3.0}}
A-B: Array2DRowRealMatrix{{4.0,-4.0,-12.0},{1.0,-8.0,1.0}}
3A: Array2DRowRealMatrix{{3.0,0.0,-12.0},{6.0,-9.0,-3.0}}
A-2B: Array2DRowRealMatrix{{7.0,-8.0,-20.0},{0.0,-13.0,3.0}}

**** 行列の積
行列A: Array2DRowRealMatrix{{3.0,-3.0,1.0},{0.0,-2.0,4.0}}
行列B: Array2DRowRealMatrix{{-1.0,0.0},{5.0,1.0},{0.0,-3.0}}
AB: Array2DRowRealMatrix{{-18.0,-6.0},{-10.0,-14.0}}

**** 逆行列
行列A(正則行列): Array2DRowRealMatrix{{1.0,2.0},{3.0,4.0}}
Aの逆行列: Array2DRowRealMatrix{{-2.0,1.0},{1.5,-0.5}}
行列B(正則行列ではない): Array2DRowRealMatrix{{4.0,2.0},{6.0,3.0}}
Bの逆行列: Array2DRowRealMatrix{{0.0,-0.0},{-0.0,0.0}}

**** 行列式、固有値と固有ベクトル
行列式: 1.9999999999999996
固有値: -1.0
固有ベクトル: {0.7071067812; 0.7071067812}
固有値: -1.9999999999999996
固有ベクトル: {2.8284271247; 4.2426406871}

参考文献:
 石井園子著「改訂版 すぐわかる線形代数」 1994年 東京図書