Basic reductions of general and structured linear matrix pencils

MatrixPencils._preduceBF!Function
_preduceBF!(M, N, Q, Z, L::Union{AbstractMatrix,Missing}, R::Union{AbstractMatrix,Missing}; 
            fast = true, atol = 0, rtol, roff = 0, coff = 0, rtrail = 0, ctrail = 0, 
            withQ = true, withZ = true) -> n, m, p

Reduce the partitioned matrix pencil M - λN

          [   *         *         *  ] roff
 M - λN = [   0      M22-λN22     *  ] npp
          [   0         0         *  ] rtrail
            coff       npm     ctrail

to an equivalent basic form F - λG = Q1'*(M - λN)*Z1 using orthogonal transformation matrices Q1 and Z1 such that the subpencil M22 - λN22 is transformed into the following standard form

                   | B  | A-λE | 
      F22 - λG22 = |----|------| ,        
                   | D  |  C   |

where E is an nxn non-singular matrix, and A, B, C, D are nxn-, nxm-, pxn- and pxm-dimensional matrices, respectively. The order n of E is equal to the numerical rank of N determined using the absolute tolerance atol and relative tolerance rtol. M and N are overwritten by F and G, respectively.

The performed orthogonal or unitary transformations are accumulated in Q (i.e., Q <- Q*Q1), if withQ = true, and Z (i.e., Z <- Z*Z1), if withZ = true.

The matrix L is overwritten by Q1'*L unless L = missing and the matrix R is overwritten by R*Z1 unless R = missing.

If fast = true, E is determined upper triangular using a rank revealing QR-decomposition with column pivoting of N22 and n is evaluated as the number of nonzero diagonal elements of the R factor, whose magnitudes are greater than tol = max(atol,abs(R[1,1])*rtol). If fast = false, E is determined diagonal using a rank revealing SVD-decomposition of N22 and n is evaluated as the number of singular values greater than tol = max(atol,smax*rtol), where smax is the largest singular value. The rank decision based on the SVD-decomposition is generally more reliable, but the involved computational effort is higher.

source
MatrixPencils._preduce1!Function
_preduce1!(n::Int, m::Int, p::Int, M::AbstractMatrix, N::AbstractMatrix,
           Q::Union{AbstractMatrix,Nothing}, Z::Union{AbstractMatrix,Nothing}, tol,
           L::Union{AbstractMatrix{T},Missing} = missing, R::Union{AbstractMatrix{T},Missing} = missing; 
           fast = true, roff = 0, coff = 0, rtrail = 0, ctrail = 0, withQ = true, withZ = true)

Reduce the structured pencil M - λN

 M = [ *  * *  *  ] roff          N = [ *  * *  *  ] roff
     [ 0  B A  *  ] n                 [ 0  0 E  *  ] n
     [ 0  D C  *  ] p                 [ 0  0 0  *  ] p
     [ 0  * *  *  ] rtrail            [ 0  * *  *  ] rtrail
     coff m n ctrail                  coff m n ctrail

with E upper triangular and nonsingular to the following form M1 - λN1 = Q1'*(M - λN)*Z1 with

M1 = [ *   *    *    *    *  ] roff       N1 = [ *   *  *   *    *   ] roff
     [ 0   B1   A11 A12   *  ] τ+ρ             [ 0   0  E11 E12  *   ] τ+ρ
     [ 0   0    B2  A22   *  ] n-ρ             [ 0   0  0   E22  *   ] n-ρ
     [ 0   0    D2  C2    *  ] p-τ             [ 0   0  0   0    *   ] p-τ
     [ 0   *    *   *     *  ] rtrail          [ 0   *  *   *    *   ] rtrail
      coff m    ρ  n-ρ ctrail                   coff m  ρ  n-ρ ctrail

where τ = rank D, B1 is full row rank, and E22 is upper triangular and nonsingular. The performed orthogonal or unitary transformations are accumulated in Q (i.e., Q <- Q*Q1), if withQ = true, and Z (i.e., Z <- Z*Z1), if withZ = true. The rank decisions use the absolute tolerance tol for the nonzero elements of M.

The matrix L is overwritten by Q1'*L unless L = missing and the matrix R is overwritten by R*Z1 unless R = missing.

source
MatrixPencils._preduce3!Function
_preduce3!(n::Int, m::Int, M::AbstractMatrix, N::AbstractMatrix, 
           Q::Union{AbstractMatrix,Nothing}, Z::Union{AbstractMatrix,Nothing}, tol,
           L::Union{AbstractMatrix{T},Missing} = missing, R::Union{AbstractMatrix{T},Missing} = missing; 
           fast = true, roff = 0, coff = 0, rtrail = 0, ctrail = 0,  withQ = true, withZ = true)

Reduce the structured pencil

    [ *  *  *   *  ] roff        [ *  *  *   *  ] roff
M = [ 0  B  A   *  ] n       N = [ 0  0  E   *  ] n
    [ 0  *  *   *  ] rtrail      [ 0  *  *   *  ] rtrail
    coff m  n ctrail             coff m  n ctrail

with E upper triangular and nonsingular to the following form M1 - λN1 = Q1'*(M - λN)*Z1 with

     [ *  *   *   *     *  ] roff        [ *  *  *   *     *  ] roff
M1 = [ 0  B1  A11 A12   *  ] ρ      N1 = [ 0  0  E11 E12   *  ] ρ
     [ 0  0   A21 A22   *  ] n-ρ         [ 0  0  0   E22   *  ] n-ρ
     [ 0  *   *   *     *  ] rtrail      [ 0  *  *   *     *  ] rtrail
     coff m   ρ   n-ρ ctrail             coff m  ρ   n-ρ ctrail

where B1 has full row rank ρ and E11 and E22 are upper triangular and nonsingular. The performed orthogonal or unitary transformations are accumulated in Q (i.e., Q <- Q*Q1), if withQ = true, and Z (i.e., Z <- Z*Z1), if withZ = true. The rank decisions use the absolute tolerance tol for the nonzero elements of M.

The matrix L is overwritten by Q1'*L unless L = missing and the matrix R is overwritten by R*Z1 unless R = missing.

source
MatrixPencils._preduce2!Function
_preduce2!(n::Int, m::Int, p::Int, M::AbstractMatrix, N::AbstractMatrix, 
           Q::Union{AbstractMatrix,Nothing}, Z::Union{AbstractMatrix,Nothing}, tol,
           L::Union{AbstractMatrix{T},Missing} = missing, R::Union{AbstractMatrix{T},Missing} = missing; 
           fast = true, roff = 0, coff = 0, rtrail = 0, ctrail = 0, withQ = true, withZ = true)

Reduce the structured pencil

 M = [ *  * *   *  ] roff          N = [ *  * *  *   ] roff
     [ *  B A   *  ] n                 [ 0  0 E  *   ] n
     [ *  D C   *  ] p                 [ 0  0 0  *   ] p
     [ 0  0 0   *  ] rtrail            [ 0  0 0  *   ] rtrail
     coff m n ctrail                   coff m n ctrail

with E upper triangular and nonsingular to the following form M1 - λN1 = Q1'*(M - λN)*Z1 with

M1 = [ *    *   *    *    *  ] roff       N1 = [ *    *   *   *    *   ] roff
     [ *    B1  A11 A12   *  ] n-ρ             [ 0    0  E11 E12   *   ] n-ρ
     [ *    D1  C1  A22   *  ] ρ               [ 0    0   0  E22   *   ] ρ
     [ 0    0   0   C2    *  ] p               [ 0    0   0   0    *   ] p
     [ 0    0   0   0     *  ] rtrail          [ 0    0   0   0    *   ] rtrail
      coff m-τ n-ρ τ+ρ ctrail                   coff m-τ n-ρ τ+ρ ctrail

where τ = rank D, C2 is full column rank and E11 and E22 are upper triangular and nonsingular. The performed orthogonal or unitary transformations are accumulated in Q (i.e., Q <- Q*Q1), if withQ = true, and Z (i.e., Z <- Z*Z1), if withZ = true. The rank decisions use the absolute tolerance tol for the nonzero elements of M.

The matrix L is overwritten by Q1'*L unless L = missing and the matrix R is overwritten by R*Z1 unless R = missing.

source
MatrixPencils._preduce4!Function
_preduce4!(n::Int, m::Int, p::Int, M::AbstractMatrix, N::AbstractMatrix, 
           Q::Union{AbstractMatrix,Nothing}, Z::Union{AbstractMatrix,Nothing}, tol,
           L::Union{AbstractMatrix{T},Missing} = missing, R::Union{AbstractMatrix{T},Missing} = missing; 
           fast = true, roff = 0, coff = 0, rtrail = 0, ctrail = 0,  withQ = true, withZ = true)

Reduce the structured pencil

M = [ *  *  *   *  ] roff          N = [ *  *  *   *  ] roff
    [ 0  B  A   *  ]  n                [ 0  0  E   *  ]  n
    [ 0  0  C   *  ]  p                [ 0  0  0   *  ]  p
    [ 0  *  *   *  ] rtrail            [ 0  *  *   *  ] rtrail
    coff m  n ctrail                   coff m  n ctrail

with E upper triangular and nonsingular to the following form M1 - λN1 = Q1'*(M - λN)*Z1 with

M1 = [ *  *   *   *    * ] roff         N1 = [ *  *  *   *    * ] roff
     [ 0  B1  A11 A12  * ]  n-ρ              [ 0  0  E11 E12  * ]  n-ρ
     [ 0  B2  A21 A22  * ]  ρ                [ 0  0  0   E22  * ]  ρ
     [ 0  0   0   C1   * ]  p                [ 0  0  0   0    * ]  p
     [ 0  *   *   *    * ] rtrail            [ 0  *  *   *    * ] rtrail
     coff m  n-ρ  ρ ctrail                   coff m n-ρ  ρ ctrail

where C1 has full column rank and E11 and E22 are upper triangular and nonsingular. The performed orthogonal or unitary transformations are accumulated in Q (i.e., Q <- Q*Q1), if withQ = true, and Z (i.e., Z <- Z*Z1), if withZ = true. The rank decisions use the absolute tolerance tol for the nonzero elements of M.

The matrix L is overwritten by Q1'*L unless L = missing and the matrix R is overwritten by R*Z1 unless R = missing.

source
MatrixPencils._sreduceB!Function
_sreduceB!(A::AbstractMatrix{T},E::AbstractMatrix{T},B::AbstractMatrix{T},Q::Union{AbstractMatrix{T},Nothing}, tol::Real; 
            fast = true, withQ = true) -> ρ

Reduce the n x m matrix B using an orthogonal or unitary similarity transformation Q1 to the row compressed form

 BT = Q1'*B = [ B11 ] ρ
              [  0  ] n-ρ
                 m

where B11 has full row rank ρ. Q1'*A, Q1'*E and BT are returned in A, E and B, respectively. The performed orthogonal or unitary transformations are accumulated in Q if withQ = true. The rank decisions use the absolute tolerance tol for the nonzero elements of B.

source
MatrixPencils._sreduceBA!Function
_sreduceBA!(n::Int,m::Int,A::AbstractMatrix{T},B::AbstractMatrix{T},C::Union{AbstractMatrix{T},Missing},Q::Union{AbstractMatrix{T},Nothing}, tol::Real; 
            fast = true, init = true, roff = 0, coff = 0, withQ = true) -> ρ

Reduce for init = true, the pair (A,B) using an orthogonal or unitary similarity transformation on the matrices A and B of the form H = Q1'*A*Q1, G = Q1'*B, to the form

 G = [ B11 ]  H = [ A11 A12 ] ρ
     [ 0   ]        B2  A22 ] n-ρ
       m            ρ   n-ρ

where B11 has full row rank ρ. H, G and C*Q1 are returned in A, B and C, respectively. The performed orthogonal or unitary transformations are accumulated in Q if withQ = true. The rank decisions use the absolute tolerance tol for the nonzero elements of B.

Reduce for init = false, the matrix A of the form

A = [ *   *  *  ] roff
    [ 0   B1 A1 ] n
     coff m  n

using an orthogonal or unitary similarity transformation on the submatrices A1 and B1 of the form H1 = Q1'A1Q1, G1 = Q1'*B1, to the form

                                 [ *   *    *   *   ] roff
 H = diag(I,Q1')*A*diag(I,Q1) =  [ *   B11  A11 A12 ] ρ
                                 [ 0   0    B2  A22 ] n-ρ
                                  coff m    ρ   n-ρ

where B11 has full row rank ρ. H and C*diag(I,Q1) are returned in A and C, respectively, and B is unchanged. The performed orthogonal or unitary transformations are accumulated in Q if withQ = true. The rank decisions use the absolute tolerance tol for the nonzero elements of A.

source
MatrixPencils._sreduceBAE!Function
_sreduceBAE!(n::Int,m::Int,A::AbstractMatrix{T},E::AbstractMatrix{T},B::AbstractMatrix{T},C::Union{AbstractMatrix{T},Missing},
             Q::Union{AbstractMatrix{T},Nothing}, Z::Union{AbstractMatrix{T},Nothing}, tol::Real; 
             fast = true, init = true, roff = 0, coff = 0, withQ = true, withZ = true)

Reduce for init = true, the pair (A-λE,B), with E upper-triangular, using an orthogonal or unitary similarity transformations on the matrices A, E and B of the form At = Q1'*A*Z1, Et = Q1'*E*Z1, Bt = Q1'*B, to the form

 Bt = [ B11 ]  At = [ A11 A12 ] ρ     Et = [ E11 E12 ] ρ
      [ 0   ]         B2  A22 ] n-ρ        [  0  E22 ] n-ρ
        m             ρ   n-ρ                 ρ   n-ρ

where B11 has full row rank ρ and Et is upper-triangular. Bt, At, Et and C*Z1 are returned in B, A, E and C, respectively. The performed orthogonal or unitary transformations are accumulated in Q as Q <- Q*Q1 if withQ = true and in Z as Z <- Z*Z1 if withZ = true. The rank decisions use the absolute tolerance tol for the nonzero elements of B.

Reduce for init = false, the matrices A and E of the form

A = [ *   *  *  ] roff     E = [ *   *  *  ] roff
    [ 0   B1 A1 ] n            [ 0   0  E1 ] n
     coff m  n                  coff m  n

with E1 upper triangular, using an orthogonal or unitary similarity transformations on the submatrices A1, E1 and B1 of the form At1 = Q1'*A1*Z1, Et1 = Q1'*E1*Z1, Bt1 = Q1'*B1, to the form

                                  [ *   *    *   *   ] roff
 At = diag(I,Q1')*A*diag(I,Z1) =  [ 0   B11  A11 A12 ] ρ
                                  [ 0   0    B2  A22 ] n-ρ
                                   coff m    ρ   n-ρ    

                                  [ *   *    *   *   ] roff
 Et = diag(I,Q1')*A*diag(I,Z1) =  [ 0   0    E11 E12 ] ρ
                                  [ 0   0    0   E22 ] n-ρ
                                   coff m    ρ   n-ρ

where B11 has full row rank ρ, and E11 and E22 are upper triangular. At, Et and C*diag(I,Z1) are returned in A, E and C, respectively, and B is unchanged. The performed orthogonal or unitary transformations are accumulated in Q as Q <- Q*diag(I,Q1) if withQ = true and in Z as Z <- Z*diag(I,Z1) if withZ = true. The rank decisions use the absolute tolerance tol for the nonzero elements of A.

source
MatrixPencils._sreduceC!Function
_sreduceC!(A::AbstractMatrix{T},E::AbstractMatrix{T},C::AbstractMatrix{T},Z::Union{AbstractMatrix{T},Nothing}, tol::Real; 
            fast = true, withZ = true) -> ρ

Reduce the p x n matrix C using an orthogonal or unitary similarity transformation Z1 to the column compressed form

 CT = C*Z1 = [ 0  C11 ] p
              n-ρ  ρ

where C11 has full column rank ρ. A*Z1, E*Z1 and CT are returned in A, E and C, respectively. The performed orthogonal or unitary transformations are accumulated in Z if withZ = true. The rank decisions use the absolute tolerance tol for the nonzero elements of C.

source
MatrixPencils._sreduceAC!Function
_sreduceAC!(n::Int,p::Int,A::AbstractMatrix{T},C::AbstractMatrix{T},B::Union{AbstractMatrix{T},Missing},
            Q::Union{AbstractMatrix{T},Nothing}, tol::Real; 
            fast = true, init = true, rtrail = 0, ctrail = 0, withQ = true) -> ρ

Reduce for init = true, the pair (A,C) using an orthogonal or unitary similarity transformation on the matrices A and C of the form H = Q1'*A*Q1, L = C*Q1, to the form

 H = [ A11 A12 ] n-ρ    L = [ 0  C11 ] p
     [ C2  A22 ] ρ           n-ρ  ρ
       n-ρ  ρ

where C11 has full column rank ρ. H, L and Q1'*B are returned in A, C and B, respectively. The performed orthogonal or unitary transformations are accumulated in Q if withQ = true. The rank decisions use the absolute tolerance tol for the nonzero elements of C.

Reduce for init = false, the matrix A of the form

    [ A1  *   ] n
A = [ C1  *   ] p
    [ 0   *   ] rtrail
      n ctrail

using an orthogonal or unitary similarity transformation on the submatrices A1 and C1 of the form H1 = Q1'A1Q1, L1 = C1*Q1, to the form

                                 [ A11 A12  *   ] n-ρ
                                 [ C2  A22  *   ] ρ
 H = diag(Q1',I)*A*diag(Q1,I) =  [ 0   C11  *   ] p
                                 [ 0   0    *   ] rtrail
                                  n-ρ  ρ  ctrail

where C11 has full column rank ρ. H and diag(Q1',I)*B are returned in A and B, respectively, and C is unchanged. The performed orthogonal or unitary transformations are accumulated in Q if withQ = true. The rank decisions use the absolute tolerance tol for the nonzero elements of A.

source
MatrixPencils._sreduceAEC!Function
_sreduceAEC!(n::Int,p::Int,A::AbstractMatrix{T},E::AbstractMatrix{T},C::AbstractMatrix{T},B::Union{AbstractMatrix{T},Missing},
            Q::Union{AbstractMatrix{T},Nothing}, Z::Union{AbstractMatrix{T},Nothing}, tol::Real; 
            fast = true, init = true, rtrail = 0, ctrail = 0, withQ = true, withZ = true) -> ρ

Reduce for init = true, the pair (A-λE,C), with E upper-triangular, using an orthogonal or unitary similarity transformations on the matrices A, E and C of the form At = Q1'*A*Z1, Et = Q1'*E*Z1, Ct = C*Z1, to the form

 Ct = [ 0  C11 ] p   At = [ A11 A12 ] n-ρ   Et = [ E11 E12 ] n-ρ  
       n-ρ  ρ             [ C2  A22 ] ρ          [  0  E22 ] ρ   
                            n-ρ  ρ                 n-ρ  ρ

where C11 has full column rank ρ and Et is upper-triangular. Ct, At, Et and Q1'*B are returned in C, A, E and B, respectively. The performed orthogonal or unitary transformations are accumulated in Q as Q <- Q*Q1 if withQ = true and in Z as Z <- Z*Z1 if withZ = true. The rank decisions use the absolute tolerance tol for the nonzero elements of C.

Reduce for init = false, the matrices A and E of the form

    [ A1  *   ] n               [ E1  *   ] n
A = [ C1  *   ] p          E =  [ 0   *   ] p
    [ 0   *   ] rtrail          [ 0   *   ] rtrail
      n ctrail

with E1 upper triangular, using an orthogonal or unitary similarity transformations on the submatrices A1, E1 and C1 of the form At1 = Q1'*A1*Z1, Et1 = Q1'*E1*Z1, Ct1 = C1*Z1, to the form

                                  [ A11 A12  *   ] n-ρ
                                  [ C2  A22  *   ] ρ
 At = diag(Q1',I)*A*diag(Q1,I) =  [ 0   C11  *   ] p
                                  [ 0   0    *   ] rtrail
                                   n-ρ  ρ  ctrail    

                                  [ E11 E12  *   ] n-ρ
                                  [ 0   E22  *   ] ρ
 Et = diag(Q1',I)*A*diag(Q1,I) =  [ 0   0    *   ] p
                                  [ 0   0    *   ] rtrail
                                   n-ρ  ρ  ctrail

where C11 has full column rank ρ, and E11 and E22 are upper triangular. At, Et and diag(I,Q1')*B are returned in A, E and B, respectively, and C is unchanged. The performed orthogonal or unitary transformations are accumulated in Q as Q <- Q*diag(I,Q1) if withQ = true and in Z as Z <- Z*diag(I,Z1) if withZ = true. The rank decisions use the absolute tolerance tol for the nonzero elements of A.

source