dggrqf function

void dggrqf(
  1. int M,
  2. int P,
  3. int N,
  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 dggrqf(
  final int M,
  final int P,
  final int N,
  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, 'DGERQF', ' ', M, N, -1, -1);
  NB2 = ilaenv(1, 'DGEQRF', ' ', P, N, -1, -1);
  NB3 = ilaenv(1, 'DORMRQ', ' ', M, N, P, -1);
  NB = max(NB1, max(NB2, NB3));
  LWKOPT = max(1, max(N, max(M, P)) * NB);
  WORK[1] = LWKOPT.toDouble();
  LQUERY = (LWORK == -1);
  if (M < 0) {
    INFO.value = -1;
  } else if (P < 0) {
    INFO.value = -2;
  } else if (N < 0) {
    INFO.value = -3;
  } else if (LDA < max(1, M)) {
    INFO.value = -5;
  } else if (LDB < max(1, P)) {
    INFO.value = -8;
  } else if (LWORK < max(max(1, M), max(P, N)) && !LQUERY) {
    INFO.value = -11;
  }
  if (INFO.value != 0) {
    xerbla('DGGRQF', -INFO.value);
    return;
  } else if (LQUERY) {
    return;
  }

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

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

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

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

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

  dgeqrf(P, N, B, LDB, TAUB, WORK, LWORK, INFO);
  WORK[1] = max(LOPT, WORK[1].toInt()).toDouble();
}