第一个jar包——矩阵行列式求解

第一次写自己的博客,项目有一个简单的项目需求,需要用到大量的矩阵运算,因此写了一个简单的矩阵求解类。

这里贴上第一块,如何求解行列式的值。

行列式的求解直接利用了定义,一个矩阵的行列式可以表示为 |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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值