where A_ij is the so-called minor (it is A with the i-th row and j-th column removed). Note that it is a recursive definition; it terminates since the size of the matrices decreases and the determinant of a number is the number itself.
In Java it can be implemented like this (for i=1, i.e. the first row):
package de.bigdev;
public class Determinant {
/**
* Determinant of a matrix using Laplace's formula with expanding along the
* 0th row. It is not checked whether the matrix is quadratic!
*
* @param m Matrix
* @return determinant
*/
public static double det(double[][] m) {
int n = m.length;
if (n == 1) {
return m[0][0];
} else {
double det = 0;
for (int j = 0; j < n; j++) {
det += Math.pow(-1, j) * m[0][j] * det(minor(m, 0, j));
}
return det;
}
}
/**
* Computing the minor of the matrix m without the i-th row and the j-th
* column
*
* @param m input matrix
* @param i removing the i-th row of m
* @param j removing the j-th column of m
* @return minor of m
*/
private static double[][] minor(final double[][] m, final int i, final int j) {
int n = m.length;
double[][] minor = new double[n-1][n-1];
// index for minor matrix position:
int r = 0, s = 0;
for (int k = 0; k < n; k++) {
double[] row = m[k];
if (k != i) {
for (int l = 0; l < row.length; l++) {
if (l != j) {
minor[r][s++] = row[l];
}
}
r++;
s = 0;
}
}
return minor;
}
private static void printMatrix(double[][] m) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < m.length; i++) {
double[] row = m[i];
sb.append("[");
for (int j = 0; j < row.length; j++) {
sb.append(" ");
sb.append(row[j]);
}
sb.append(" ]\n");
}
sb.deleteCharAt(sb.length() - 1);
System.out.println(sb.toString());
}
public static void main(String[] args) {
System.out.println("Determinant");
System.out.println("===========");
double[][] a = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 0 } };
double[][] b = { { 1 } };
double[][] c = { { 1, 2 }, { 3, 4 } };
System.out.println("");
System.out.println("Testing minor");
System.out.println("=============");
printMatrix(a);
System.out.println("deleting row 3, and column 2:");
printMatrix(minor(a, 2, 1));
System.out.println("");
System.out.println("Testing det");
System.out.println("===========");
printMatrix(b);
System.out.println("has det=" + det(b) +"\n");
printMatrix(c);
System.out.println("has det=" + det(c) +"\n");
printMatrix(a);
System.out.println("has det=" + det(a) +"\n");
}
}
You get following output on the console:
Determinant
===========
Testing minor
=============
[ 1.0 2.0 3.0 ]
[ 4.0 5.0 6.0 ]
[ 7.0 8.0 0.0 ]
deleting row 3, and column 2:
[ 1.0 3.0 ]
[ 4.0 6.0 ]
Testing det
===========
[ 1.0 ]
has det=1.0
[ 1.0 2.0 ]
[ 3.0 4.0 ]
has det=-2.0
[ 1.0 2.0 3.0 ]
[ 4.0 5.0 6.0 ]
[ 7.0 8.0 0.0 ]
has det=27.0

No comments:
Post a Comment