(S|D|C|Z)LASR

Single, double, single complex, and double complex LASR.

Description

Applies a sequence of plane rotations to a rectangular matrix.

When SIDE is L, LASR performs:

A \assign P \mult A

When SIDE is R, LASR performs:

A \assign A \mult \trans{P}

The matrix P is an orthogonal matrix formed as the product of plane rotations.

When DIRECT is F:

P = P_{K} \mult \dots \mult P_2 \mult P_1

When DIRECT is B:

P = P_1 \mult P_2 \mult \dots \mult P_{K}

Each plane rotation is formed around a pivot.

When PIVOT is T:

P_k =
\left[
  \begin{matrix}
    c_k &   &        &   & s_k &   &        &   \\
        & 1 &        &   &     &   &        &   \\
        &   & \ddots &   &     &   &        &   \\
        &   &        & 1 &     &   &        &   \\
   -s_k &   &        &   & c_k &   &        &   \\
        &   &        &   &     & 1 &        &   \\
        &   &        &   &     &   & \ddots &   \\
        &   &        &   &     &   &        & 1 \\
  \end{matrix}
\right]

When PIVOT is B:

P_k =
\left[
  \begin{matrix}
1 &          &   &      &   &        &   &     \\
  &  \ddots  &   &      &   &        &   &     \\
  &          & 1 &      &   &        &   &     \\
  &          &   &  c_k &   &        &   & s_k \\
  &          &   &      & 1 &        &   &     \\
  &          &   &      &   & \ddots &   &     \\
  &          &   &      &   &        & 1 &     \\
  &          &   & -s_k &   &        &   & c_k \\
  \end{matrix}
\right]

When PIVOT is V:

P_k =
\left[
  \begin{matrix}
1 &          &   &      &      &   &        &   \\
  &  \ddots  &   &      &      &   &        &   \\
  &          & 1 &      &      &   &        &   \\
  &          &   &  c_k & s_k  &   &        &   \\
  &          &   & -s_k & c_k  &   &        &   \\
  &          &   &      &      & 1 &        &   \\
  &          &   &      &      &   & \ddots &   \\
  &          &   &      &      &   &        & 1 \\
  \end{matrix}
\right]

LAPACK Interface

void slasr(const char *SIDE, const char *PIVOT, const char *DIRECT,
    const qml_long *M,const qml_long *N, const float *C, const float *S,
    float *A, const qml_long *LDA);

void dlasr(const char *SIDE, const char *PIVOT, const char *DIRECT,
    const qml_long *M, const qml_long *N, const double *C, const double *S,
    double *A, const qml_long *LDA);

void clasr(const char *SIDE, const char *PIVOT, const char *DIRECT,
    const qml_long *M, const qml_long *N, const float *C, const float *S,
    qml_single_complex *A, const qml_long *LDA);

void zlasr(const char *SIDE, const char *PIVOT, const char *DIRECT,
    const qml_long *M, const qml_long *N, const double *C, const double *S,
    qml_double_complex *A, const qml_long *LDA);

Arguments

SIDE Which side to apply plane rotations to
PIVOT Positions of pivots
DIRECT Direction to apply rotations
M Number of rows of A
N Number of columns of A
C Array of cosine values for plane rotations
S Array of sine values for plane rotations
A Matrix of size M x N
LDA Leading dimension of A