dgeqrt2 function

void dgeqrt2(
  1. int M,
  2. int N,
  3. Matrix<double> A_,
  4. int LDA,
  5. Matrix<double> T_,
  6. int LDT,
  7. Box<int> INFO,
)

Implementation

void dgeqrt2(
  final int M,
  final int N,
  final Matrix<double> A_,
  final int LDA,
  final Matrix<double> T_,
  final int LDT,
  final Box<int> INFO,
) {
  final A = A_.having(ld: LDA);
  final T = T_.having(ld: LDT);
  const ONE = 1.0e+00, ZERO = 0.0e+00;
  int I, K;
  double AII, ALPHA;

  // Test the input arguments

  INFO.value = 0;
  if (N < 0) {
    INFO.value = -2;
  } else if (M < N) {
    INFO.value = -1;
  } else if (LDA < max(1, M)) {
    INFO.value = -4;
  } else if (LDT < max(1, N)) {
    INFO.value = -6;
  }
  if (INFO.value != 0) {
    xerbla('DGEQRT2', -INFO.value);
    return;
  }

  K = min(M, N);

  for (I = 1; I <= K; I++) {
    // Generate elem. refl. H(i) to annihilate A(i+1:m,i), tau(I) -> T(I,1)

    dlarfg(
        M - I + 1, A.box(I, I), A(min(I + 1, M), I).asArray(), 1, T.box(I, 1));
    if (I < N) {
      // Apply H(i) to A(I:M,I+1:N) from the left

      AII = A[I][I];
      A[I][I] = ONE;

      // W(1:N-I) := A(I:M,I+1:N)^H * A(I:M,I) [W = T(:,N)]

      dgemv('T', M - I + 1, N - I, ONE, A(I, I + 1), LDA, A(I, I).asArray(), 1,
          ZERO, T(1, N).asArray(), 1);

      // A(I:M,I+1:N) = A(I:m,I+1:N) + alpha*A(I:M,I)*W(1:N-1)^H

      ALPHA = -T[I][1];
      dger(M - I + 1, N - I, ALPHA, A(I, I).asArray(), 1, T(1, N).asArray(), 1,
          A(I, I + 1), LDA);
      A[I][I] = AII;
    }
  }

  for (I = 2; I <= N; I++) {
    AII = A[I][I];
    A[I][I] = ONE;

    // T(1:I-1,I) := alpha * A(I:M,1:I-1)**T * A(I:M,I)

    ALPHA = -T[I][1];
    dgemv('T', M - I + 1, I - 1, ALPHA, A(I, 1), LDA, A(I, I).asArray(), 1,
        ZERO, T(1, I).asArray(), 1);
    A[I][I] = AII;

    // T(1:I-1,I) := T(1:I-1,1:I-1) * T(1:I-1,I)

    dtrmv('U', 'N', 'N', I - 1, T, LDT, T(1, I).asArray(), 1);

    // T(I,I) = tau(I)

    T[I][I] = T[I][1];
    T[I][1] = ZERO;
  }
}