@@ -22,36 +22,38 @@ BunchKaufman(A::AbstractMatrix{T}, ipiv::Vector{BlasInt}, uplo::Char, symmetric:
2222`bkfact!` is the same as [`bkfact`](@ref), but saves space by overwriting the
2323input `A`, instead of creating a copy.
2424"""
25- function bkfact! (A:: StridedMatrix{ <:BlasReal} , uplo :: Symbol = :U ,
26- symmetric :: Bool = issymmetric (A), rook:: Bool = false )
27-
28- if ! symmetric
29- throw ( ArgumentError ( " Bunch-Kaufman decomposition is only valid for symmetric matrices " ) )
25+ function bkfact! (A:: HermOrSym{T,S} where {T <: BlasReal ,S <: StridedMatrix{T} }, rook :: Bool = false )
26+ if rook
27+ LD, ipiv, info = LAPACK . sytrf_rook! (A . uplo, A . data)
28+ else
29+ LD, ipiv, info = LAPACK . sytrf! (A . uplo, A . data )
3030 end
31+ BunchKaufman (LD, ipiv, A. uplo, true , rook, info)
32+ end
33+ function bkfact! (A:: Symmetric{T,S} where {T<: BlasComplex ,S<: StridedMatrix{T} }, rook:: Bool = false )
3134 if rook
32- LD, ipiv, info = LAPACK. sytrf_rook! (char_uplo ( uplo) , A)
35+ LD, ipiv, info = LAPACK. sytrf_rook! (A . uplo, A. data )
3336 else
34- LD, ipiv, info = LAPACK. sytrf! (char_uplo ( uplo) , A)
37+ LD, ipiv, info = LAPACK. sytrf! (A . uplo, A. data )
3538 end
36- BunchKaufman (LD, ipiv, char_uplo ( uplo), symmetric , rook, info)
39+ BunchKaufman (LD, ipiv, A . uplo, true , rook, info)
3740end
38- function bkfact! (A:: StridedMatrix{<:BlasComplex} , uplo:: Symbol = :U ,
39- symmetric:: Bool = issymmetric (A), rook:: Bool = false )
40-
41+ function bkfact! (A:: Hermitian{T,S} where {T<: BlasComplex ,S<: StridedMatrix{T} }, rook:: Bool = false )
4142 if rook
42- if symmetric
43- LD, ipiv, info = LAPACK. sytrf_rook! (char_uplo (uplo), A)
44- else
45- LD, ipiv, info = LAPACK. hetrf_rook! (char_uplo (uplo), A)
46- end
43+ LD, ipiv, info = LAPACK. hetrf_rook! (A. uplo, A. data)
4744 else
48- if symmetric
49- LD, ipiv, info = LAPACK. sytrf! (char_uplo (uplo), A)
50- else
51- LD, ipiv, info = LAPACK. hetrf! (char_uplo (uplo), A)
52- end
45+ LD, ipiv, info = LAPACK. hetrf! (A. uplo, A. data)
46+ end
47+ BunchKaufman (LD, ipiv, A. uplo, false , rook, info)
48+ end
49+ function bkfact! (A:: StridedMatrix{<:BlasFloat} , rook:: Bool = false )
50+ if ishermitian (A)
51+ return bkfact! (Hermitian (A), rook)
52+ elseif issymmetric (A)
53+ return bkfact! (Symmetric (A), rook)
54+ else
55+ throw (ArgumentError (" Bunch-Kaufman decomposition is only valid for symmetric or Hermitian matrices" ))
5356 end
54- BunchKaufman (LD, ipiv, char_uplo (uplo), symmetric, rook, info)
5557end
5658
5759"""
@@ -69,13 +71,8 @@ The following functions are available for
6971[^Bunch1977]: J R Bunch and L Kaufman, Some stable methods for calculating inertia and solving symmetric linear systems, Mathematics of Computation 31:137 (1977), 163-179. [url](http://www.ams.org/journals/mcom/1977-31-137/S0025-5718-1977-0428694-0/).
7072
7173"""
72- bkfact (A:: StridedMatrix{<:BlasFloat} , uplo:: Symbol = :U , symmetric:: Bool = issymmetric (A),
73- rook:: Bool = false ) =
74- bkfact! (copy (A), uplo, symmetric, rook)
75- bkfact (A:: StridedMatrix{T} , uplo:: Symbol = :U , symmetric:: Bool = issymmetric (A),
76- rook:: Bool = false ) where {T} =
77- bkfact! (convert (Matrix{promote_type (Float32, typeof (sqrt (one (T))))}, A),
78- uplo, symmetric, rook)
74+ bkfact (A:: AbstractMatrix{T} , rook:: Bool = false ) where {T} =
75+ bkfact! (copy_oftype (A, typeof (sqrt (one (T)))), rook)
7976
8077convert (:: Type{BunchKaufman{T}} , B:: BunchKaufman{T} ) where {T} = B
8178convert (:: Type{BunchKaufman{T}} , B:: BunchKaufman ) where {T} =
@@ -90,9 +87,9 @@ ishermitian(B::BunchKaufman) = !B.symmetric
9087
9188issuccess (B:: BunchKaufman ) = B. info == 0
9289
93- function Base. show (io:: IO , F :: BunchKaufman )
94- println (io, summary (F ))
95- print (io, " successful: $(issuccess (F )) " )
90+ function Base. show (io:: IO , mime :: MIME{Symbol("text/plain")} , B :: BunchKaufman )
91+ println (io, summary (B ))
92+ print (io, " successful: $(issuccess (B )) " )
9693end
9794
9895function inv (B:: BunchKaufman{<:BlasReal} )
0 commit comments