用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

求矩阵的逆矩阵

2012-11-20 作者: 程序猿style举报

[java]代码库

	/**
	 * 求矩阵的逆矩阵 为矩阵右加一个单位矩阵后进行初等行变换,当左边变成单位矩阵时,右边就是求得的逆矩阵。 矩阵的初等行变换法则
	 * (1)交换变换:交换两行 (2)倍法变换:给一行数据乘以一个非0常数 (3)消法变换:把一行所有元素的k倍加到另一行的对应元素上去
	 * 将上述规则中的行换成列同样有效 只有方阵才可能有逆矩阵!
	 * 
	 * @return
	 */
	public Matrix inverseMatrix() {
		if (!this.isSquareMatrix()) {
			System.out.println("不是方阵没有逆矩阵!");
			return null;
		}
		// 先在右边加上一个单位矩阵。
		Matrix tempM = this.appendUnitMatrix();
		// 再进行初等变换,把左边部分变成单位矩阵
		double[][] tempData = tempM.getMatrixData();
		int tempRow = tempData.length;
		int tempCol = tempData[0].length;
		// 对角线上数字为0时,用于交换的行号
		int line = 0;
		// 对角线上数字的大小
		double bs = 0;
		// 一个临时变量,用于交换数字时做中间结果用
		double swap = 0;
		for (int i = 0; i < tempRow; i++) {
			// 将左边部分对角线上的数据等于0,与其他行进行交换
			if (tempData[i][i] == 0) {
				if (++line >= tempRow) {
					System.out.println("此矩阵没有逆矩阵!");
					return null;
				}

				for (int j = 0; j < tempCol; j++) {
					swap = tempData[i][j];
					tempData[i][j] = tempData[line][j];
					tempData[line][j] = swap;
				}

				// 当前行(第i行)与第line行进行交换后,需要重新对第i行进行处理
				// 因此,需要将行标i减1,因为在for循环中会将i加1。
				i--;
				// 继续第i行处理,此时第i行的数据是原来第line行的数据。
				continue;
			}

			// 将左边部分矩阵对角线上的数据变成1.0
			if (tempData[i][i] != 1) {
				bs = tempData[i][i];
				for (int j = tempCol - 1; j >= 0; j--) {
					tempData[i][j] /= bs;
				}
				// 将左边部分矩阵变成上对角矩阵,
				// 所谓上对角矩阵是矩阵的左下角元素全为0
				for (int iNow = i + 1; iNow < tempRow; iNow++) {
					for (int j = tempCol - 1; j >= i; j--) {
						tempData[iNow][j] -= tempData[i][j] * tempData[iNow][i];
					}
				}
			}
		}

		// 将左边部分矩阵从上对角矩阵变成单位矩阵,即将矩阵的右上角元素也变为0
		for (int i = 0; i < tempRow - 1; i++) {
			for (int iNow = i; iNow < tempRow - 1; iNow++) {
				for (int j = tempCol - 1; j >= 0; j--) {
					tempData[i][j] -= tempData[i][iNow + 1]
							* tempData[iNow + 1][j];
				}
			}
		}

		// 右边部分就是它的逆矩阵
		Matrix c = null;
		int cRow = tempRow;
		int cColumn = tempCol / 2;
		double[][] cData = new double[cRow][cColumn];
		// 将右边部分的值赋给cData
		for (int i = 0; i < cRow; i++) {
			for (int j = 0; j < cColumn; j++) {
				cData[i][j] = tempData[i][cColumn + j];
			}
		}
		// 得到逆矩阵,返回
		c = new Matrix(cData);
		return c;
	}


网友评论    (发表评论)

共1 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...