/**
* FileName: Matrix.java
* Author: Shiuh-Sheng Yu
* Since: 1998/3/17
* Modify Date: 2005/07/11, add more comments
*/
public class Matrix {
private double[][] data;
/* constructor */
public Matrix(double[][] array) {
data = array;
}
/* constructor */
private Matrix(int x, int y) {
data = new double[x][y];
}
/*
* 複製物件
*/
public Object clone() {
double[][] x = new double[data.length][data[0].length];
for (int i=0; i < x.length; i++) {
for (int j=0; j < x[0].length; j++) {
x[i][j] = data[i][j];
}
}
return new Matrix(x);
}
/**
* 矩陣加法
* X is m by n, Y is m by n, Z = X + Y is m by n
* Zij = Xij + Yij
*/
public Matrix add(Matrix x) throws MalMatrixException {
/* 判斷兩矩陣是否同樣大小 */
if (data.length != x.data.length || data[0].length != x.data[0].length) {
throw new MalMatrixException(); // 丟出例外
}
Matrix rel = (Matrix)this.clone(); // 先將this物件複製到rel
for (int i=0; i < data.length; i++) {
for (int j=0; j < data[0].length; j++) {
rel.data[i][j] += x.data[i][j];
}
}
return rel;
}
/**
* 矩陣相乘
* X is m by n, Y is n by p
* result Z is m by p where for each 0<= i < m, 0 <= j < p
* Zij = Sum Xik*Ykj
* k=0 to n-1
*/
public Matrix multiply(Matrix x) throws MalMatrixException {
if (data[0].length!=x.data.length) {
throw new MalMatrixException();
}
Matrix rel = new Matrix(data.length,x.data[0].length);
for (int i=0; i < data.length; i++) {
for (int j=0; j < x.data[0].length; j++) {
double tmp = 0;
for (int k=0; k < data[0].length; k++) {
tmp += data[i][k] * x.data[k][j];
}
rel.data[i][j]= tmp;
}
}
return rel;
}
/**
* 將矩陣內容印到螢幕上
*/
public void print() {
for (int i=0; i < data.length; i++) {
for (int j=0; j < data[0].length; j++) {
System.out.print(data[i][j]+" ");
}
System.out.println("");
}
}
/**
* 高斯消去法求行列式值
*/
public double determinant() throws NonSquareMatrixException {
if (data.length != data[0].length) {
throw new NonSquareMatrixException();
}
int n = data.length;
int i, j, k, l;
double sign = 1;
double tmp, factor, result;
double[][] right = new double[n][n];
// 將資料copy到另一個陣列
for (i=0; i < n; i++) {
for (j=0; j < n; j++) {
right[i][j] = data[i][j];
}
}
for (i=0; i < n-1; i++) { // 由左而右
for (k=i; k < n; k++) { // 找對角線以下非0之元素
if (right[k][i]!=0) {
break;
}
}
if (k==n) { // 找不到非0的元素
return 0;
}
if (k != i) { // 對角線上是0, 需做列交換
for (l=i; l < n; l++) {
tmp = right[i][l];
right[i][l] = right[k][l];
right[k][l] = tmp;
}
sign *= -1; // 列交換需乘-1
}
for (k=i+1;k < n;k++) { // 由上而下
if (right[k][i] != 0) { // 列運算. 若right[k][i]是0的話就不用再算了
factor = right[k][i]/right[i][i];
right[k][i]=0;
for (j=i+1; j < n; j++) {
right[k][j] -= right[i][j]*factor;
}
}
}
}
for (i=1, result=right[0][0]; i < n; i++) {
result*=right[i][i];
}
return sign*result;
}
}
MalMatrix.java如下
public class MalMatrixException extends Exception {
MalMatrixException() {
super("MalMatrixException:");
}
}
NonSquareMatrixException.java如下
public class NonSquareMatrixException extends Exception {
NonSquareMatrixException() {
super("NonSquareMatrixException:");
}
}