Skip to content

Commit 5ffd833

Browse files
authored
Clarify the structure of Bunch-Kaufman factors (#1341)
It took me a while to realize that the `D` in Bunch-Kaufman is block diagonal, not diagonal, so I thought I'd save others the trouble. I also mention `P`, `U`, and `L` for completeness, even though they are less surprising since they match the usual meaning of matrix factors with those names.
2 parents c723c59 + 260cbf2 commit 5ffd833

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

src/bunchkaufman.jl

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ ClosedScalar = Union{T, Complex{T}} where T <: ClosedReal
1818
1919
Matrix factorization type of the Bunch-Kaufman factorization of a symmetric or
2020
Hermitian matrix `A` as `P'UDU'P` or `P'LDL'P`, depending on whether the upper
21-
(the default) or the lower triangle is stored in `A`. If `A` is complex symmetric
21+
(the default) or the lower triangle is stored in `A`. Here, `U` and `L` are
22+
respectively upper and lower triangular, `P` is a permutation matrix, and `D`
23+
is block diagonal with 1-by-1 and 2-by-2 blocks. If `A` is complex symmetric
2224
then `U'` and `L'` denote the unconjugated transposes, i.e. `transpose(U)` and
2325
`transpose(L)`, respectively. This is the return type of [`bunchkaufman`](@ref),
2426
the corresponding matrix factorization function.
@@ -136,6 +138,8 @@ bkcopy_oftype(A::Symmetric{<:Complex}, S) = Symmetric(copytrito!(similar(parent(
136138
Compute the Bunch-Kaufman [^Bunch1977] factorization of a symmetric or
137139
Hermitian matrix `A` as `P'*U*D*U'*P` or `P'*L*D*L'*P`, depending on
138140
which triangle is stored in `A`, and return a [`BunchKaufman`](@ref) object.
141+
Here, `U` and `L` are respectively upper and lower triangular, `P` is a
142+
permutation matrix, and `D` is block diagonal with 1-by-1 and 2-by-2 blocks.
139143
Note that if `A` is complex symmetric then `U'` and `L'` denote
140144
the unconjugated transposes, i.e. `transpose(U)` and `transpose(L)`.
141145
@@ -706,18 +710,20 @@ LD<:AbstractMatrix, ipiv<:AbstractVector{Integer}, info::BlasInt
706710
707711
Computes the Bunch-Kaufman factorization of a symmetric or Hermitian
708712
matrix `A` of size `NxN` as `P'*U*D*U'*P` or `P'*L*D*L'*P`, depending on
709-
which triangle is stored in `A`. Note that if `A` is complex symmetric
710-
then `U'` and `L'` denote the unconjugated transposes, i.e.
711-
`transpose(U)` and `transpose(L)`. The resulting `U` or `L` and D are
712-
stored in-place in `A`, LAPACK style. `LD` is just a reference to `A`
713-
(that is, `LD===A`). `ipiv` stores the permutation information of the
714-
algorithm in LAPACK format. `info` indicates whether the factorization
715-
was successful and non-singular when `info==0`, or else `info` takes a
716-
different value. The outputs `LD`, `ipiv`, `info` follow the format of
717-
the LAPACK functions of the Bunch-Kaufman factorization (`dsytrf`,
718-
`csytrf`, `chetrf`, etc.), so this function can (ideally) be used
719-
interchangeably with its LAPACK counterparts `LAPACK.sytrf!`,
720-
`LAPACK.sytrf_rook!`, etc.
713+
which triangle is stored in `A`. Here, `U` and `L` are
714+
respectively upper and lower triangular, `P` is a permutation matrix,
715+
and `D` is block diagonal with 1-by-1 and 2-by-2 blocks. Note that if
716+
`A` is complex symmetric then `U'` and `L'` denote the unconjugated
717+
transposes, i.e. `transpose(U)` and `transpose(L)`. The resulting `U` or
718+
`L` and `D` are stored in-place in `A`, LAPACK style. `LD` is just a
719+
reference to `A` (that is, `LD===A`). `ipiv` stores the permutation
720+
information of the algorithm in LAPACK format. `info` indicates whether
721+
the factorization was successful and non-singular when `info==0`, or
722+
else `info` takes a different value. The outputs `LD`, `ipiv`, `info`
723+
follow the format of the LAPACK functions of the Bunch-Kaufman
724+
factorization (`dsytrf`, `csytrf`, `chetrf`, etc.), so this function can
725+
(ideally) be used interchangeably with its LAPACK counterparts
726+
`LAPACK.sytrf!`, `LAPACK.sytrf_rook!`, etc.
721727
722728
`uplo` is a character, either `'U'` or `'L'`, indicating whether the
723729
matrix is stored in the upper triangular part (`uplo=='U'`) or in the

0 commit comments

Comments
 (0)