逆矩阵 java_求矩阵的逆矩阵

[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;

}

694748ed64b9390909c0d88230893790.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值