public class Matrix {
private double[][] data;
public Matrix(double[][] array) {
data = array;
}
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);
}
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();
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;
}
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];
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++) {
if (right[k][i]!=0) {
break;
}
}
if (k==n) {
return 0;
}
if (k != i) {
for (l=i; l < n; l++) {
tmp = right[i][l];
right[i][l] = right[k][l];
right[k][l] = tmp;
}
sign *= -1;
}
for (k=i+1;k < n;k++) {
if (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:");
}
}