第一次写自己的博客,项目有一个简单的项目需求,需要用到大量的矩阵运算,因此写了一个简单的矩阵求解类。
这里贴上第一块,如何求解行列式的值。
行列式的求解直接利用了定义,一个矩阵的行列式可以表示为 |A| =∑( -1)^(j) * a0j * |M|, 其中, j 表示第0行第j列,a0j表示第0行第j个元素,M表示a0j的代数余子式,基于该公式,编写矩阵行列式求解的代码。
可以看到,代数余子式也是一个矩阵,因此,很容易想到用递归的方法进行求解,这里贴上递归求解代码
/**计算A行列式的结果,采用递归方式
* @param A 行列式
* @param length A行列式的行数
* @return
*/
public double get_Determinant(double A[][],int length){
//子行列式为2*2矩阵
if(length == 2){
return A[0][0] * A[1][1] - A[0][1] * A[1][0];
}
double result = 0;
//子行列式不是2*2矩阵
//B矩阵为A[0][j]的子矩阵
double B[][] = new double[length - 1][length - 1];
for(int i = 0; i < length; i++){
//如果当前元素为0,则不需要乘后续的子矩阵
if(A[0][i] == 0){
continue;
}
B = get_SubMatrix(A, 0, i, length);
result = result + Math.pow(-1,i) * A[0][i] * get_Determinant(B,length - 1);
}
return result;
}
在该函数中,需要获取不同a0j对应的代数余子式
/**获取当前矩阵某个元素的子矩阵
* @param A 当前矩阵
* @param m 第m行
* @param n 第n列
* @param length 矩阵的行
* @return 子矩阵
*/
public double[][] get_SubMatrix(double A[][], int m, int n, int length){
double B[][] = new double[length - 1][length - 1];
int i_b = 0;
int j_b = 0;
for(int i = 0; i < length; i++){
//去掉第m行元素
if(i == m)continue;
for(int j = 0; j < length; j++){
//去掉第n列元素
if(j == n)continue;
B[i_b][j_b] = A[i][j];
j_b++;
}
i_b++;
j_b = 0;
}
return B;
}
最后,就是调用get_Determinant函数,进行计算,所有的计算均以第一行为计算行,因此,我们要分别求第一行元素乘其代数余子式对应的值,代码如下:
/**计算行列式
* @param A 要求解的矩阵
* @return 行列式的结果
*/
public double get_Result(double A[][]){
//判断row和col是否相等,否则不能求解行列式
if(row != col){
System.out.println("无法计算行列式");
return 0;
}
int length = A.length;
//如果是二维的话可以直接返回结果
if(length == 2){
return A[0][0] * A[1][1] - A[0][1] * A[1][0];
}
double result = 0; //行列式的值
double B[][] = new double[length][length];
for(int i = 0; i < length; i++){
B = get_SubMatrix(A, 0, i, length);
if(A[0][i] == 0){
continue;
}
result = result + Math.pow(-1,i) * A[0][i] * get_Determinant(B,length - 1);
}
return result;
}
最后,直接调用get_Result,就可以获得当前矩阵的行列式的值了,当然,为了保证计算过程无错,在进行计算前,先判断该矩阵是否为N*N矩阵,如果不是,则直接返回null