public Matrix matrixReverse() { // 求矩阵的逆
    int i, j, k;
    double change;
    Matrix matrix_reverse = new Matrix(this);

    for (i = 0; i < matrix_reverse.getLine(); i++)
      for (j = matrix_reverse.getRow(); j < 2 * matrix_reverse.getRow(); j++)
        matrix_reverse.setElement(i, j, (j == matrix_reverse.getRow() + i) ? 1 : 0);
    matrix_reverse.setRow(2 * matrix_reverse.getRow());
    matrix_reverse = matrix_reverse.matrixLineSimplify();
    /*将矩阵的左半边化为单位阵*/
    for (i = 0; i < matrix_reverse.getLine() - 1; i++)
      for (j = i + 1; j < matrix_reverse.getRow() / 2; j++) {
        if (matrix_reverse.getElement(i, j) == 0) continue;
        if (matrix_reverse.getElement(i, j) < 0)
          for (k = 0; k < matrix_reverse.getRow(); k++)
            matrix_reverse.setElement(i, k, -matrix_reverse.getElement(i, k));
        if (matrix_reverse.getElement(j, j) < 0)
          for (k = 0; k < matrix_reverse.getRow(); k++)
            matrix_reverse.setElement(j, k, -matrix_reverse.getElement(j, k));
        change = matrix_reverse.getElement(i, j) / matrix_reverse.getElement(j, j);
        for (k = 0; k < matrix_reverse.getRow(); k++)
          matrix_reverse.setElement(
              i, k, matrix_reverse.getElement(i, k) - matrix_reverse.getElement(j, k) * change);
      }
    matrix_reverse.setRow(matrix_reverse.getRow() / 2);
    for (i = 0; i < matrix_reverse.getLine(); i++)
      for (j = 0; j < matrix_reverse.getRow(); j++)
        matrix_reverse.setElement(i, j, matrix_reverse.getElement(i, j + matrix_reverse.getRow()));
    return matrix_reverse;
  }
  public double determinantValue() // 计算行列式
      {
    int i, j, k, p = 0;
    double change, value = 1.0;
    Matrix matrix = new Matrix(this);

    for (i = 0; i < matrix.getLine(); i++) {
      for (j = i + 1; j < matrix.getLine(); j++)
        for (; p < matrix.getLine(); p++) {
          if (matrix.getElement(i, p) == 0 && matrix.getElement(j, p) != 0)
            for (k = p; k < matrix.getRow(); k++)
              matrix.setElement(i, k, matrix.getElement(i, k) + matrix.getElement(j, k));
          else if (matrix.getElement(i, p) == 0 && matrix.getElement(j, p) == 0) {
            for (; j < matrix.getLine() && matrix.getElement(j, p) == 0; j++) ;
            if (j == matrix.getLine()) {
              j = i + 1;
              continue;
            } else {
              for (k = p; k < matrix.getRow(); k++)
                matrix.setElement(i, k, matrix.getElement(i, k) + matrix.getElement(j, k));
            }
          } else if (matrix.getElement(i, p) != 0 && matrix.getElement(j, p) == 0) break;
          change = matrix.getElement(j, p) / matrix.getElement(i, p);
          for (k = p; k < matrix.getRow(); k++)
            matrix.setElement(j, k, matrix.getElement(j, k) - matrix.getElement(i, k) * change);
          break;
        }
      p = i;
    }
    for (i = 0; i < matrix.getLine(); i++) value *= matrix.getElement(i, i);
    return value;
  }
  public static Matrix matrixMultiply(Matrix matrix1, Matrix matrix2) { // 矩阵乘法
    int i, j, k;
    Matrix matrix = new Matrix();

    matrix.setLine(matrix1.getLine());
    matrix.setRow(matrix2.getRow());
    matrix.setAccuracy(matrix1.getAccuracy());
    for (i = 0; i < matrix.getLine(); i++)
      for (j = 0; j < matrix.getRow(); j++) matrix.setElement(i, j, 0.0);
    for (i = 0; i < matrix.getLine(); i++)
      for (j = 0; j < matrix.getRow(); j++)
        for (k = 0; k < matrix1.getRow(); k++)
          matrix.setElement(
              i, j, matrix.getElement(i, j) + matrix1.getElement(i, k) * matrix2.getElement(k, j));
    return matrix;
  }
  public Matrix matrixNumMultiply(double x) { // 矩阵乘以一个数
    int i, j;
    Matrix matrix = new Matrix(this);

    for (i = 0; i < matrix.getLine(); i++)
      for (j = 0; j < matrix.getRow(); j++) matrix.setElement(i, j, x * matrix.getElement(i, j));
    return matrix;
  }
  public Matrix matrixAccuralize() { // 精确化矩阵
    int i, j;
    Matrix matrix = new Matrix(this);

    for (i = 0; i < matrix.getLine(); i++)
      for (j = 0; j < matrix.getRow(); j++)
        if (Math.abs(matrix.getElement(i, j)) <= matrix.getAccuracy()) matrix.setElement(i, j, 0.0);
    return matrix;
  }
 public static Matrix panelToMatrix(JTextField[] jtfMatrix, int line, int row, double accuracy) {
   int i, j;
   Matrix matrix = new Matrix(line, row, accuracy);
   for (i = 0; i < line; i++)
     for (j = 0; j < row; j++) {
       if (jtfMatrix[i * row + j].getText().equals("")) return null;
       matrix.setElement(i, j, Double.parseDouble(jtfMatrix[i * row + j].getText()));
     }
   return matrix;
 }
  public Matrix matrixTranspose() { // 矩阵转置
    int i, j;
    Matrix trans_matrix = new Matrix();

    for (i = 0; i < getLine(); i++)
      for (j = 0; j < getRow(); j++) trans_matrix.setElement(j, i, this.getElement(i, j));
    trans_matrix.setLine(getLine());
    trans_matrix.setRow(getRow());
    trans_matrix.setAccuracy(getAccuracy());
    return trans_matrix;
  }
  public static Matrix matrixMinus(Matrix matrix1, Matrix matrix2) { // 矩阵减法
    int i, j;
    Matrix matrix = new Matrix();

    for (i = 0; i < matrix1.getLine(); i++)
      for (j = 0; j < matrix1.getRow(); j++)
        matrix.setElement(i, j, matrix1.getElement(i, j) - matrix2.getElement(i, j));
    matrix.setLine(matrix1.getLine());
    matrix.setRow(matrix1.getRow());
    matrix.setAccuracy(matrix1.getAccuracy());
    return matrix;
  }
  public static Matrix scanMatrix() { // 输入矩阵
    int i, j;
    Matrix matrix = new Matrix();
    Scanner scanner = new Scanner(System.in);

    matrix.setLine(scanner.nextInt());
    matrix.setRow(scanner.nextInt());
    matrix.setAccuracy(scanner.nextDouble());
    for (i = 0; i < matrix.getLine(); i++) {
      for (j = 0; j < matrix.getRow(); j++) matrix.setElement(i, j, scanner.nextDouble());
    }
    return matrix;
  }
  public Matrix matrixLineSimplify() { // 矩阵的行简化
    int i, j, k, p = 0;
    double change, first_of_line;
    Matrix matrix0 = new Matrix(this);

    for (i = 0; i < matrix0.getLine(); i++) {
      for (j = i + 1; j < matrix0.getLine(); j++)
        for (; p < matrix0.getRow(); p++) {
          if (matrix0.getElement(i, p) == 0 && matrix0.getElement(j, p) != 0)
            for (k = 0; k < matrix0.getRow(); k++)
              matrix0.setElement(i, k, matrix0.getElement(i, k) + matrix0.getElement(j, k));
          else if (matrix0.getElement(i, p) == 0 && matrix0.getElement(j, p) == 0) {
            for (; j < matrix0.getLine() && matrix0.getElement(j, p) == 0; j++) ;
            if (j == matrix0.getLine()) {
              j = i + 1;
              continue;
            } else {
              for (k = p; k < matrix0.getRow(); k++)
                matrix0.setElement(i, k, matrix0.getElement(i, k) + matrix0.getElement(j, k));
            }
          } else if (matrix0.getElement(i, p) != 0 && matrix0.getElement(j, p) == 0) break;
          if (matrix0.getElement(i, p) < 0)
            for (k = p; k < matrix0.getRow(); k++)
              matrix0.setElement(i, k, -matrix0.getElement(i, k));
          if (matrix0.getElement(j, p) < 0)
            for (k = p; k < matrix0.getRow(); k++)
              matrix0.setElement(j, k, -matrix0.getElement(j, k));
          change = matrix0.getElement(j, p) / matrix0.getElement(i, p);
          for (k = p; k < matrix0.getRow(); k++)
            matrix0.setElement(j, k, matrix0.getElement(j, k) - matrix0.getElement(i, k) * change);
          break;
        }
      p = i;
    }
    // 将每一行最简化
    matrix0 = matrix0.matrixAccuralize();
    for (i = 0; i < matrix0.getLine(); i++) {
      for (j = 0; j < matrix0.getRow() && matrix0.getElement(i, j) == 0; j++) ;
      first_of_line = matrix0.getElement(i, j);
      if (j == matrix0.getRow()) continue;
      for (; j < matrix0.getRow(); j++)
        matrix0.setElement(i, j, matrix0.getElement(i, j) / first_of_line);
    }
    return matrix0;
  }