首先要明确一点:非方阵不能求逆
也就是 n == m需要去判断的,a.length == a[0].length
为了更好的看清代码,我们先看下数学过程:
代码语言:javascript复制 /**
* 矩阵求逆
*
* @param args
* 参数a是个浮点型(double)的二维数组,
* @return 返回值是一个浮点型二维数组(矩阵a的逆矩阵)
*/
public static double[][] inv(double[][] matrix) {
int n = matrix.length;
double[][] matrix1 = new double[n][2 * n];
double[][] result = new double[n][n];
for (int i = 0; i < n; i ) {
for (int j = 0; j < n; j ) {
matrix1[i][j] = matrix[i][j];
}
}
for (int k = 0; k < n; k ) {
for (int t = n; t < n * 2; t ) {
if ((t - k) == n) {
matrix1[k][t] = 1.0;
} else {
matrix1[k][t] = 0;
}
}
}
// get the change of the array
for (int k = 0; k < n; k ) {
if (matrix1[k][k] != 1) {
double bs = matrix1[k][k];
matrix1[k][k] = 1;
for (int p = k; p < n * 2; p ) {
matrix1[k][p] /= bs;
}
}
for (int q = 0; q < n; q ) {
if (q != k) {
double bs = matrix1[q][k];
for (int p = 0; p < n * 2; p ) {
matrix1[q][p] -= bs * matrix1[k][p];
}
} else {
continue;
}
}
}
for (int x = 0; x < n; x ) {
for (int y = n; y < n * 2; y ) {
result[x][y - n] = matrix1[x][y];
}
}
return result;
}
现在我们先来跟踪代码输出的四个主for循环的结果分别是什么:
-------------------------------- 1.0 2.00.0 0.0 3.0 4.00.0 0.0 -------------------------------- 1.0 2.01.0 0.0 3.0 4.00.0 1.0 -------------------------------- 1.0 3.0-2.0 1.0 0.0 -0.51.5 -0.5 -------------------------------- 1.0 3.0-2.0 1.0 0.0 -0.51.5 -0.5 -------------------------------- -2.0 1.0 1.5 -0.5
非常清楚这个过程就跟数学过程一样的:编代码就非常的清楚了
接下来我们再看看:过程处理是怎么样的一个过程:
-------------------------------- 1.02.01.00.0 0.0-2.0-3.01.0 -------------------------------- 1.02.01.00.0 0.0-0.51.5-0.5