dggqrf function

void dggqrf(
  1. int N,
  2. int M,
  3. int P,
  4. Matrix<double> A_,
  5. int LDA,
  6. Array<double> TAUA_,
  7. Matrix<double> B_,
  8. int LDB,
  9. Array<double> TAUB_,
  10. Array<double> WORK_,
  11. int LWORK,
  12. Box<int> INFO,
)

Implementation

void dggqrf(
  final int N,
  final int M,
  final int P,
  final Matrix<double> A_,
  final int LDA,
  final Array<double> TAUA_,
  final Matrix<double> B_,
  final int LDB,
  final Array<double> TAUB_,
  final Array<double> WORK_,
  final int LWORK,
  final Box<int> INFO,
) {
  final A = A_.having(ld: LDA);
  final TAUA = TAUA_.having();
  final B = B_.having(ld: LDB);
  final TAUB = TAUB_.having();
  final WORK = WORK_.having();
  bool LQUERY;
  int LOPT, LWKOPT, NB, NB1, NB2, NB3;

  // Test the input parameters

  INFO.value = 0;
  NB1 = ilaenv(1, 'DGEQRF', ' ', N, M, -1, -1);
  NB2 = ilaenv(1, 'DGERQF', ' ', N, P, -1, -1);
  NB3 = ilaenv(1, 'DORMQR', ' ', N, M, P, -1);
  NB = max(NB1, max(NB2, NB3));
  LWKOPT = max(max(1, N), max(M, P) * NB);
  WORK[1] = LWKOPT.toDouble();
  LQUERY = (LWORK == -1);
  if (N < 0) {
    INFO.value = -1;
  } else if (M < 0) {
    INFO.value = -2;
  } else if (P < 0) {
    INFO.value = -3;
  } else if (LDA < max(1, N)) {
    INFO.value = -5;
  } else if (LDB < max(1, N)) {
    INFO.value = -8;
  } else if (LWORK < max(max(1, N), max(M, P)) && !LQUERY) {
    INFO.value = -11;
  }
  if (INFO.value != 0) {
    xerbla('DGGQRF', -INFO.value);
    return;
  } else if (LQUERY) {
    return;
  }

  // QR factorization of N-by-M matrix A: A = Q*R

  dgeqrf(N, M, A, LDA, TAUA, WORK, LWORK, INFO);
  LOPT = WORK[1].toInt();

  // Update B := Q**T*B.

  dormqr('Left', 'Transpose', N, P, min(N, M), A, LDA, TAUA, B, LDB, WORK,
      LWORK, INFO);
  LOPT = max(LOPT, WORK[1].toInt());

  // RQ factorization of N-by-P matrix B: B = T*Z.

  dgerqf(N, P, B, LDB, TAUB, WORK, LWORK, INFO);

  WORK[1] = max(LOPT, WORK[1].toInt()).toDouble();
}