当前位置: 首页 > 面试题库 >

Java逆矩阵计算

范承志
2023-03-14
问题内容

我正在尝试计算Java中的逆矩阵。

我遵循伴随方法(首先计算伴随矩阵,然后转置该矩阵,最后将其乘以行列式值的倒数)。

当矩阵不太大时有效。我检查过,对于尺寸最大为12x12的矩阵,可以快速提供结果。但是,当矩阵大于12x12时,完成计算所需的时间呈指数增长。

我需要反转的矩阵是19x19,并且花费太多时间。消耗更多时间的方法是用于行列式计算的方法。

我使用的代码是:

public static double determinant(double[][] input) {
  int rows = nRows(input);        //number of rows in the matrix
  int columns = nColumns(input); //number of columns in the matrix
  double determinant = 0;

  if ((rows== 1) && (columns == 1)) return input[0][0];

  int sign = 1;     
  for (int column = 0; column < columns; column++) {
    double[][] submatrix = getSubmatrix(input, rows, columns,column);
    determinant = determinant + sign*input[0][column]*determinant(submatrix);
    sign*=-1;
  }
  return determinant;
}

有人知道如何更有效地计算大矩阵的行列式吗?如果不是,是否有人知道如何使用其他算法计算大矩阵的逆?

谢谢


问题答案:

指数?不,我相信矩阵求逆是O(N ^ 3)。

我建议使用LU分解来求解矩阵方程。使用时无需求解行列式。

更好的是,寻找一个可以帮助您的软件包。 JAMA浮现在脑海。

12x12或19x19不是大型矩阵。这是常见的解决与几十或几百问题 十万 的自由度。

这是如何使用JAMA的有效示例。编译和运行时,必须在CLASSPATH中包含JAMA JAR:

package linearalgebra;

import Jama.LUDecomposition;
import Jama.Matrix;

public class JamaDemo
{
    public static void main(String[] args)
    {
        double [][] values = {{1, 1, 2}, {2, 4, -3}, {3, 6, -5}};  // each array is a row in the matrix
        double [] rhs = { 9, 1, 0 }; // rhs vector
        double [] answer = { 1, 2, 3 }; // this is the answer that you should get.

        Matrix a = new Matrix(values);
        a.print(10, 2);
        LUDecomposition luDecomposition = new LUDecomposition(a);
        luDecomposition.getL().print(10, 2); // lower matrix
        luDecomposition.getU().print(10, 2); // upper matrix

        Matrix b = new Matrix(rhs, rhs.length);
        Matrix x = luDecomposition.solve(b); // solve Ax = b for the unknown vector x
        x.print(10, 2); // print the solution
        Matrix residual = a.times(x).minus(b); // calculate the residual error
        double rnorm = residual.normInf(); // get the max error (yes, it's very small)
        System.out.println("residual: " + rnorm);
    }
}

这是根据quantum_dev的建议使用Apache Commons Math解决的相同问题:

package linearalgebra;

import org.apache.commons.math.linear.Array2DRowRealMatrix;
import org.apache.commons.math.linear.ArrayRealVector;
import org.apache.commons.math.linear.DecompositionSolver;
import org.apache.commons.math.linear.LUDecompositionImpl;
import org.apache.commons.math.linear.RealMatrix;
import org.apache.commons.math.linear.RealVector;

public class LinearAlgebraDemo
{
    public static void main(String[] args)
    {
        double [][] values = {{1, 1, 2}, {2, 4, -3}, {3, 6, -5}};
        double [] rhs = { 9, 1, 0 };

        RealMatrix a = new Array2DRowRealMatrix(values);
        System.out.println("a matrix: " + a);
        DecompositionSolver solver = new LUDecompositionImpl(a).getSolver();

        RealVector b = new ArrayRealVector(rhs);
        RealVector x = solver.solve(b);
        System.out.println("solution x: " + x);;
        RealVector residual = a.operate(x).subtract(b);
        double rnorm = residual.getLInfNorm();
        System.out.println("residual: " + rnorm);
    }
}

使这些适应您的情况。



 类似资料:
  • 矩阵A的倒数用A -1表示,使得以下关系成立 - AA<sup>−1</sup> = A<sup>−1</sup>A = 1 矩阵的逆矩阵并不总是存在。 如果矩阵的行列式为零,则逆不存在且矩阵是单数的。 使用inv函数计算MATLAB中矩阵的逆。 矩阵A的逆是由inv(A)给出的。 例子 (Example) 创建一个脚本文件并键入以下代码 - a = [ 1 2 3; 2 3 4; 1 2 5]

  • 我有一个矩阵。只有唯一的颜色以不同的权重重复它们自己。从它们中,我得选择一半,另一半必须用从第一个中最接近的元素替换。 我想到了在图像中循环,并搜索最近的颜色为当前的一个。找到后,我把一个换成另一个。 但我有3个循环、、。前两个I循环通过RGB矩阵,第三个用于循环到包含最终颜色的矩阵。这需要一些时间来计算。 可以做些什么来加快它的速度? 循环如下所示: 表示选择为最终颜色的半色。 我可以考虑一些小

  • 本文向大家介绍java实现的n*n矩阵求值及求逆矩阵算法示例,包括了java实现的n*n矩阵求值及求逆矩阵算法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java实现的n*n矩阵求值及求逆矩阵算法。分享给大家供大家参考,具体如下: 先来看看运行结果: java版的写出来了,用的跟c语言相同的算法,然后看看能不能以后加个框做成程序: 更多关于java算法相关内容感兴趣的读者可查看本站

  • 本文向大家介绍Java实现的求逆矩阵算法示例,包括了Java实现的求逆矩阵算法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java实现的求逆矩阵算法。分享给大家供大家参考,具体如下: 运行结果: 更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

  • 本文向大家介绍详解用java描述矩阵求逆的算法,包括了详解用java描述矩阵求逆的算法的使用技巧和注意事项,需要的朋友参考一下 今天很开心把困扰几天的问题解决了,在学习线性代数这门课程的时候。想通过程序实现里面的计算方法,比如矩阵求逆,用java代码该如何描述呢? 首先,咱们先用我们所交流语言描述一下算法思路: 1.求出一个矩阵A对应的行列式在第i,j(i表示行,j表示列)位置的余子式(余子式前面

  • 现在,我想我明白了这个概念。但是当我把它们都放入代码中时,它就不起作用了…… 首先,我试图将矩阵转换为上三角矩阵,但由于某种原因,在第2列之后,它停止工作。。 我输入的数组是: [1.00][5.00][4.00][4.00][1.00] [5.00] [7.00] [7.00] [4.00] [8.00] [7.00] [4.00] [8.00] [4.00] [7.00] [10.00][12