JAMA(JAva MAtrix package) a. は Java で基本的な線形代数計算を行うためのパブリックドメインのライブラリです。
JLAPACK の時と同じサンプル、100000 組の x と y が対になっているデータ fdata01.zip (fdata01.txt) を使って、JLAPACK の時と同じように b.、次の 4 次の多項式でフィッティングするために、その係数 c0, c1, c2, c3, c4 を最小二乗法で求めてみました。
y = c0 + c1x + c2x2 + c3x3 + c4x4
使用環境
- OS : Fedora 18 (Linux)
- JDK : jdk-1.7.0_17-fcs.x86_64
- IDE : NetBeans IDE 7.3
以下が JAMA を利用した場合のサンプルプログラムと実行例です。なお、使用した JAMA は Version 1.0.3 (November 9, 2012) です。
package jamatest; import Jama.Matrix; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class JamaTest { public static void main(String[] args) { int m = 100000, n = 5; double xMat[][], yVec[]; xMat = new double[m][n]; yVec = new double[m]; File file = new File("/home/bitwalk/work/ex101_01/fdata01.txt"); try (BufferedReader br = new BufferedReader(new FileReader(file))) { String str; int i = 0; while ((str = br.readLine()) != null) { double xValue = Double.parseDouble(str.substring(0, 6)); yVec[i] = Double.parseDouble(str.substring(6, 20)); for (int j = 0; j < n; j++) { xMat[i][j] = Math.pow(xValue, (double) j); } i++; } br.close(); } catch (FileNotFoundException e) { System.out.println(e); } catch (IOException e) { System.out.println(e); } // xMat -> X Matrix X = new Matrix(xMat, m, n); // yVec -> y Matrix y = new Matrix(yVec, m); // solution for y = Xc Matrix c = X.solve(y); // Result System.out.println("# of DATA\t" + m); System.out.println("Coefficients"); for (int j = 0; j < n; j++) { System.out.println("C(" + j + ") = " + c.get(j, 0)); } } }
run: # of DATA 100000 Coefficients C(0) = 37.76585776133068 C(1) = 0.04968384703746971 C(2) = 6.988983959987343E-6 C(3) = -4.2174249160063376E-7 C(4) = 2.686562674530643E-10 ビルド成功(合計時間: 0秒)
この程度の次数の行列計算では、JLAPACK との差を感じませんが、このサンプルの n の値を大きくすると差が顕著に判るようになります。つまり JAMA の方が遅いのですが、Java での扱いやすさは、JLAPACK に勝っていると思います。