zlabrd function

void zlabrd(
  1. int M,
  2. int N,
  3. int NB,
  4. Matrix<Complex> A_,
  5. int LDA,
  6. Array<double> D_,
  7. Array<double> E_,
  8. Array<Complex> TAUQ_,
  9. Array<Complex> TAUP_,
  10. Matrix<Complex> X_,
  11. int LDX,
  12. Matrix<Complex> Y_,
  13. int LDY,
)

Implementation

void zlabrd(
  final int M,
  final int N,
  final int NB,
  final Matrix<Complex> A_,
  final int LDA,
  final Array<double> D_,
  final Array<double> E_,
  final Array<Complex> TAUQ_,
  final Array<Complex> TAUP_,
  final Matrix<Complex> X_,
  final int LDX,
  final Matrix<Complex> Y_,
  final int LDY,
) {
  final A = A_.having(ld: LDA);
  final X = X_.having(ld: LDX);
  final Y = Y_.having(ld: LDY);
  final D = D_.having();
  final E = E_.having();
  final TAUQ = TAUQ_.having();
  final TAUP = TAUP_.having();
  int I;
  final ALPHA = Box(Complex.zero);

  // Quick return if possible

  if (M <= 0 || N <= 0) return;

  if (M >= N) {
    // Reduce to upper bidiagonal form

    for (I = 1; I <= NB; I++) {
      // Update A(i:m,i)

      zlacgv(I - 1, Y(I, 1).asArray(), LDY);
      zgemv('No transpose', M - I + 1, I - 1, -Complex.one, A(I, 1), LDA,
          Y(I, 1).asArray(), LDY, Complex.one, A(I, I).asArray(), 1);
      zlacgv(I - 1, Y(I, 1).asArray(), LDY);
      zgemv('No transpose', M - I + 1, I - 1, -Complex.one, X(I, 1), LDX,
          A(1, I).asArray(), 1, Complex.one, A(I, I).asArray(), 1);

      // Generate reflection Q(i) to annihilate A(i+1:m,i)

      ALPHA.value = A[I][I];
      zlarfg(M - I + 1, ALPHA, A(min(I + 1, M), I).asArray(), 1, TAUQ.box(I));
      D[I] = ALPHA.value.real;
      if (I < N) {
        A[I][I] = Complex.one;

        // Compute Y(i+1:n,i)

        zgemv('Conjugate transpose', M - I + 1, N - I, Complex.one, A(I, I + 1),
            LDA, A(I, I).asArray(), 1, Complex.zero, Y(I + 1, I).asArray(), 1);
        zgemv('Conjugate transpose', M - I + 1, I - 1, Complex.one, A(I, 1),
            LDA, A(I, I).asArray(), 1, Complex.zero, Y(1, I).asArray(), 1);
        zgemv('No transpose', N - I, I - 1, -Complex.one, Y(I + 1, 1), LDY,
            Y(1, I).asArray(), 1, Complex.one, Y(I + 1, I).asArray(), 1);
        zgemv('Conjugate transpose', M - I + 1, I - 1, Complex.one, X(I, 1),
            LDX, A(I, I).asArray(), 1, Complex.zero, Y(1, I).asArray(), 1);
        zgemv('Conjugate transpose', I - 1, N - I, -Complex.one, A(1, I + 1),
            LDA, Y(1, I).asArray(), 1, Complex.one, Y(I + 1, I).asArray(), 1);
        zscal(N - I, TAUQ[I], Y(I + 1, I).asArray(), 1);

        // Update A(i,i+1:n)

        zlacgv(N - I, A(I, I + 1).asArray(), LDA);
        zlacgv(I, A(I, 1).asArray(), LDA);
        zgemv('No transpose', N - I, I, -Complex.one, Y(I + 1, 1), LDY,
            A(I, 1).asArray(), LDA, Complex.one, A(I, I + 1).asArray(), LDA);
        zlacgv(I, A(I, 1).asArray(), LDA);
        zlacgv(I - 1, X(I, 1).asArray(), LDX);
        zgemv(
            'Conjugate transpose',
            I - 1,
            N - I,
            -Complex.one,
            A(1, I + 1),
            LDA,
            X(I, 1).asArray(),
            LDX,
            Complex.one,
            A(I, I + 1).asArray(),
            LDA);
        zlacgv(I - 1, X(I, 1).asArray(), LDX);

        // Generate reflection P(i) to annihilate A(i,i+2:n)

        ALPHA.value = A[I][I + 1];
        zlarfg(N - I, ALPHA, A(I, min(I + 2, N)).asArray(), LDA, TAUP.box(I));
        E[I] = ALPHA.value.real;
        A[I][I + 1] = Complex.one;

        // Compute X(i+1:m,i)

        zgemv('No transpose', M - I, N - I, Complex.one, A(I + 1, I + 1), LDA,
            A(I, I + 1).asArray(), LDA, Complex.zero, X(I + 1, I).asArray(), 1);
        zgemv('Conjugate transpose', N - I, I, Complex.one, Y(I + 1, 1), LDY,
            A(I, I + 1).asArray(), LDA, Complex.zero, X(1, I).asArray(), 1);
        zgemv('No transpose', M - I, I, -Complex.one, A(I + 1, 1), LDA,
            X(1, I).asArray(), 1, Complex.one, X(I + 1, I).asArray(), 1);
        zgemv('No transpose', I - 1, N - I, Complex.one, A(1, I + 1), LDA,
            A(I, I + 1).asArray(), LDA, Complex.zero, X(1, I).asArray(), 1);
        zgemv('No transpose', M - I, I - 1, -Complex.one, X(I + 1, 1), LDX,
            X(1, I).asArray(), 1, Complex.one, X(I + 1, I).asArray(), 1);
        zscal(M - I, TAUP[I], X(I + 1, I).asArray(), 1);
        zlacgv(N - I, A(I, I + 1).asArray(), LDA);
      }
    }
  } else {
    // Reduce to lower bidiagonal form

    for (I = 1; I <= NB; I++) {
      // Update A(i,i:n)

      zlacgv(N - I + 1, A(I, I).asArray(), LDA);
      zlacgv(I - 1, A(I, 1).asArray(), LDA);
      zgemv('No transpose', N - I + 1, I - 1, -Complex.one, Y(I, 1), LDY,
          A(I, 1).asArray(), LDA, Complex.one, A(I, I).asArray(), LDA);
      zlacgv(I - 1, A(I, 1).asArray(), LDA);
      zlacgv(I - 1, X(I, 1).asArray(), LDX);
      zgemv('Conjugate transpose', I - 1, N - I + 1, -Complex.one, A(1, I), LDA,
          X(I, 1).asArray(), LDX, Complex.one, A(I, I).asArray(), LDA);
      zlacgv(I - 1, X(I, 1).asArray(), LDX);

      // Generate reflection P(i) to annihilate A(i,i+1:n)

      ALPHA.value = A[I][I];
      zlarfg(N - I + 1, ALPHA, A(I, min(I + 1, N)).asArray(), LDA, TAUP.box(I));
      D[I] = ALPHA.value.real;
      if (I < M) {
        A[I][I] = Complex.one;

        // Compute X(i+1:m,i)

        zgemv('No transpose', M - I, N - I + 1, Complex.one, A(I + 1, I), LDA,
            A(I, I).asArray(), LDA, Complex.zero, X(I + 1, I).asArray(), 1);
        zgemv('Conjugate transpose', N - I + 1, I - 1, Complex.one, Y(I, 1),
            LDY, A(I, I).asArray(), LDA, Complex.zero, X(1, I).asArray(), 1);
        zgemv('No transpose', M - I, I - 1, -Complex.one, A(I + 1, 1), LDA,
            X(1, I).asArray(), 1, Complex.one, X(I + 1, I).asArray(), 1);
        zgemv('No transpose', I - 1, N - I + 1, Complex.one, A(1, I), LDA,
            A(I, I).asArray(), LDA, Complex.zero, X(1, I).asArray(), 1);
        zgemv('No transpose', M - I, I - 1, -Complex.one, X(I + 1, 1), LDX,
            X(1, I).asArray(), 1, Complex.one, X(I + 1, I).asArray(), 1);
        zscal(M - I, TAUP[I], X(I + 1, I).asArray(), 1);
        zlacgv(N - I + 1, A(I, I).asArray(), LDA);

        // Update A(i+1:m,i)

        zlacgv(I - 1, Y(I, 1).asArray(), LDY);
        zgemv('No transpose', M - I, I - 1, -Complex.one, A(I + 1, 1), LDA,
            Y(I, 1).asArray(), LDY, Complex.one, A(I + 1, I).asArray(), 1);
        zlacgv(I - 1, Y(I, 1).asArray(), LDY);
        zgemv('No transpose', M - I, I, -Complex.one, X(I + 1, 1), LDX,
            A(1, I).asArray(), 1, Complex.one, A(I + 1, I).asArray(), 1);

        // Generate reflection Q(i) to annihilate A(i+2:m,i)

        ALPHA.value = A[I + 1][I];
        zlarfg(M - I, ALPHA, A(min(I + 2, M), I).asArray(), 1, TAUQ.box(I));
        E[I] = ALPHA.value.real;
        A[I + 1][I] = Complex.one;

        // Compute Y(i+1:n,i)

        zgemv(
            'Conjugate transpose',
            M - I,
            N - I,
            Complex.one,
            A(I + 1, I + 1),
            LDA,
            A(I + 1, I).asArray(),
            1,
            Complex.zero,
            Y(I + 1, I).asArray(),
            1);
        zgemv('Conjugate transpose', M - I, I - 1, Complex.one, A(I + 1, 1),
            LDA, A(I + 1, I).asArray(), 1, Complex.zero, Y(1, I).asArray(), 1);
        zgemv('No transpose', N - I, I - 1, -Complex.one, Y(I + 1, 1), LDY,
            Y(1, I).asArray(), 1, Complex.one, Y(I + 1, I).asArray(), 1);
        zgemv('Conjugate transpose', M - I, I, Complex.one, X(I + 1, 1), LDX,
            A(I + 1, I).asArray(), 1, Complex.zero, Y(1, I).asArray(), 1);
        zgemv('Conjugate transpose', I, N - I, -Complex.one, A(1, I + 1), LDA,
            Y(1, I).asArray(), 1, Complex.one, Y(I + 1, I).asArray(), 1);
        zscal(N - I, TAUQ[I], Y(I + 1, I).asArray(), 1);
      } else {
        zlacgv(N - I + 1, A(I, I).asArray(), LDA);
      }
    }
  }
}