@@ -17,83 +17,51 @@ A_ldiv_B!(F::Factorization, B::StridedVecOrMat) = A_ldiv_B!(F, float(B))
17
17
Ac_ldiv_B! (F:: Factorization , B:: StridedVecOrMat ) = Ac_ldiv_B! (F, float (B))
18
18
At_ldiv_B! (F:: Factorization , B:: StridedVecOrMat ) = At_ldiv_B! (F, float (B))
19
19
20
+ # #########################
21
+ # Cholesky Factorization #
22
+ # #########################
20
23
type Cholesky{T<: BlasFloat } <: Factorization{T}
21
24
UL:: Matrix{T}
22
25
uplo:: Char
23
26
end
27
+ type CholeskyPivoted{T<: BlasFloat } <: Factorization{T}
28
+ UL:: Matrix{T}
29
+ uplo:: Char
30
+ piv:: Vector{BlasInt}
31
+ rank:: BlasInt
32
+ tol:: Real
33
+ info:: BlasInt
34
+ end
24
35
25
- function cholfact! {T<:BlasFloat} (A:: StridedMatrix{T} , uplo:: Symbol )
36
+ function cholfact! {T<:BlasFloat} (A:: StridedMatrix{T} , uplo:: Symbol = :U ; pivot = false , tol = - 1.0 )
26
37
uplochar = string (uplo)[1 ]
27
- C, info = LAPACK. potrf! (uplochar, A)
28
- @assertposdef Cholesky (C, uplochar) info
38
+ if pivot
39
+ A, piv, rank, info = LAPACK. pstrf! (uplochar, A, tol)
40
+ return CholeskyPivoted {T} (A, uplochar, piv, rank, tol, info)
41
+ else
42
+ C, info = LAPACK. potrf! (uplochar, A)
43
+ return @assertposdef Cholesky (C, uplochar) info
44
+ end
29
45
end
30
46
cholfact! (A:: StridedMatrix , args... ) = cholfact! (float (A), args... )
31
- cholfact! {T<:BlasFloat} (A:: StridedMatrix{T} ) = cholfact! (A, :U )
32
- cholfact {T<:BlasFloat} (A:: StridedMatrix{T} , args... ) = cholfact! (copy (A), args... )
33
- cholfact (A:: StridedMatrix , args... ) = cholfact! (float (A), args... )
47
+ cholfact {T<:BlasFloat} (A:: StridedMatrix{T} , uplo:: Symbol = :U ; pivot= false , tol= - 1.0 ) = cholfact! (copy (A), uplo, pivot= pivot, tol= tol)
48
+ cholfact (A:: StridedMatrix , uplo:: Symbol = :U ; pivot= false , tol= - 1.0 ) = cholfact! (float (A), uplo, pivot= pivot, tol= tol)
34
49
cholfact (x:: Number ) = @assertposdef Cholesky (fill (sqrt (x), 1 , 1 ), :U ) ! (imag (x) == 0 && real (x) > 0 )
35
50
36
- chol (A:: Union(Number, AbstractMatrix) , uplo:: Symbol ) = cholfact (A, uplo)[uplo]
37
- chol (A:: Union(Number, AbstractMatrix) ) = cholfact (A, :U )[:U ]
51
+ chol (A:: Union(Number, AbstractMatrix) , uplo:: Symbol = :U ) = cholfact (A, uplo)[uplo]
38
52
39
53
size (C:: Cholesky ) = size (C. UL)
40
54
size (C:: Cholesky ,d:: Integer ) = size (C. UL,d)
41
55
42
56
function getindex (C:: Cholesky , d:: Symbol )
43
- C. uplo == ' U' ? triu! (C. UL) : tril! (C. UL)
44
- if d == :U || d == :L
45
- return symbol (C. uplo) == d ? C. UL : C. UL'
46
- elseif d == :UL
47
- return Triangular (C. UL, C. uplo)
48
- end
57
+ d == :U && return triu! (symbol (C. uplo) == d ? C. UL : C. UL' )
58
+ d == :L && return tril! (symbol (C. uplo) == d ? C. UL : C. UL' )
59
+ d == :UL && return Triangular (C. UL, C. uplo)
49
60
throw (KeyError (d))
50
61
end
51
-
52
- A_ldiv_B! {T<:BlasFloat} (C:: Cholesky{T} , B:: StridedVecOrMat{T} ) = LAPACK. potrs! (C. uplo, C. UL, B)
53
-
54
- function det {T} (C:: Cholesky{T} )
55
- dd = one (T)
56
- for i in 1 : size (C. UL,1 ) dd *= abs2 (C. UL[i,i]) end
57
- dd
58
- end
59
-
60
- function logdet {T} (C:: Cholesky{T} )
61
- dd = zero (T)
62
- for i in 1 : size (C. UL,1 ) dd += log (C. UL[i,i]) end
63
- dd + dd # instead of 2.0dd which can change the type
64
- end
65
-
66
- inv (C:: Cholesky )= symmetrize_conj! (LAPACK. potri! (C. uplo, copy (C. UL)), C. uplo)
67
-
68
- # # Pivoted Cholesky
69
- type CholeskyPivoted{T<: BlasFloat } <: Factorization{T}
70
- UL:: Matrix{T}
71
- uplo:: Char
72
- piv:: Vector{BlasInt}
73
- rank:: BlasInt
74
- tol:: Real
75
- info:: BlasInt
76
- end
77
- function CholeskyPivoted {T<:BlasFloat} (A:: StridedMatrix{T} , uplo:: Char , tol:: Real )
78
- A, piv, rank, info = LAPACK. pstrf! (uplo, A, tol)
79
- CholeskyPivoted {T} ((uplo == ' U' ? triu! : tril!)(A), uplo, piv, rank, tol, info)
80
- end
81
-
82
- chkfullrank (C:: CholeskyPivoted ) = C. rank< size (C. UL, 1 ) && throw (RankDeficientException (C. info))
83
-
84
- cholpfact! (A:: StridedMatrix , args... ) = cholpfact! (float (A), args... )
85
- cholpfact! {T<:BlasFloat} (A:: StridedMatrix{T} , uplo:: Symbol , tol:: Real ) = CholeskyPivoted (A, string (uplo)[1 ], tol)
86
- cholpfact! {T<:BlasFloat} (A:: StridedMatrix{T} , tol:: Real ) = cholpfact! (A, :U , tol)
87
- cholpfact! {T<:BlasFloat} (A:: StridedMatrix{T} ) = cholpfact! (A, - 1. )
88
- cholpfact {T<:BlasFloat} (A:: StridedMatrix{T} , args... ) = cholpfact! (copy (A), args... )
89
- cholpfact (A:: StridedMatrix , args... ) = cholpfact! (float (A), args... )
90
-
91
- size (C:: CholeskyPivoted ) = size (C. UL)
92
- size (C:: CholeskyPivoted ,d:: Integer ) = size (C. UL,d)
93
-
94
- getindex (C:: CholeskyPivoted ) = C. UL, C. piv
95
62
function getindex {T<:BlasFloat} (C:: CholeskyPivoted{T} , d:: Symbol )
96
- (d == :U || d == :L ) && return symbol (C. uplo) == d ? C. UL : C. UL'
63
+ d == :U && return triu! (symbol (C. uplo) == d ? C. UL : C. UL' )
64
+ d == :L && return tril! (symbol (C. uplo) == d ? C. UL : C. UL' )
97
65
d == :p && return C. piv
98
66
if d == :P
99
67
n = size (C, 1 )
@@ -106,6 +74,10 @@ function getindex{T<:BlasFloat}(C::CholeskyPivoted{T}, d::Symbol)
106
74
throw (KeyError (d))
107
75
end
108
76
77
+ show (io:: IO , C:: Cholesky ) = (println (" $(typeof (C)) with factor:" );show (io,C[symbol (C. uplo)]))
78
+
79
+ A_ldiv_B! {T<:BlasFloat} (C:: Cholesky{T} , B:: StridedVecOrMat{T} ) = LAPACK. potrs! (C. uplo, C. UL, B)
80
+
109
81
function A_ldiv_B! {T<:BlasFloat} (C:: CholeskyPivoted{T} , B:: StridedVector{T} )
110
82
chkfullrank (C)
111
83
ipermute! (LAPACK. potrs! (C. uplo, C. UL, permute! (B, C. piv)), C. piv)
@@ -124,17 +96,35 @@ function A_ldiv_B!{T<:BlasFloat}(C::CholeskyPivoted{T}, B::StridedMatrix{T})
124
96
B
125
97
end
126
98
127
- rank (C:: CholeskyPivoted ) = C. rank
99
+ function det {T} (C:: Cholesky{T} )
100
+ dd = one (T)
101
+ for i in 1 : size (C. UL,1 ) dd *= abs2 (C. UL[i,i]) end
102
+ dd
103
+ end
128
104
129
105
det {T} (C:: CholeskyPivoted{T} ) = C. rank< size (C. UL,1 ) ? real (zero (T)) : prod (abs2 (diag (C. UL)))
130
106
107
+ function logdet {T} (C:: Cholesky{T} )
108
+ dd = zero (T)
109
+ for i in 1 : size (C. UL,1 ) dd += log (C. UL[i,i]) end
110
+ dd + dd # instead of 2.0dd which can change the type
111
+ end
112
+
113
+ inv (C:: Cholesky )= symmetrize_conj! (LAPACK. potri! (C. uplo, copy (C. UL)), C. uplo)
114
+
131
115
function inv (C:: CholeskyPivoted )
132
116
chkfullrank (C)
133
117
ipiv = invperm (C. piv)
134
118
(symmetrize! (LAPACK. potri! (C. uplo, copy (C. UL)), C. uplo))[ipiv, ipiv]
135
119
end
136
120
137
- # # LU
121
+ chkfullrank (C:: CholeskyPivoted ) = C. rank< size (C. UL, 1 ) && throw (RankDeficientException (C. info))
122
+
123
+ rank (C:: CholeskyPivoted ) = C. rank
124
+
125
+ # ###################
126
+ # LU Factorization #
127
+ # ###################
138
128
type LU{T<: BlasFloat } <: Factorization{T}
139
129
factors:: Matrix{T}
140
130
ipiv:: Vector{BlasInt}
@@ -204,7 +194,6 @@ function logdet{T<:Complex}(A::LU{T})
204
194
complex (r,a)
205
195
end
206
196
207
-
208
197
A_ldiv_B! {T<:BlasFloat} (A:: LU{T} , B:: StridedVecOrMat{T} ) = @assertnonsingular LAPACK. getrs! (' N' , A. factors, A. ipiv, B) A. info
209
198
At_ldiv_B {T<:BlasFloat} (A:: LU{T} , B:: StridedVecOrMat{T} ) = @assertnonsingular LAPACK. getrs! (' T' , A. factors, A. ipiv, copy (B)) A. info
210
199
Ac_ldiv_B {T<:BlasComplex} (A:: LU{T} , B:: StridedVecOrMat{T} ) = @assertnonsingular LAPACK. getrs! (' C' , A. factors, A. ipiv, copy (B)) A. info
@@ -217,23 +206,33 @@ inv(A::LU)=@assertnonsingular LAPACK.getri!(copy(A.factors), A.ipiv) A.info
217
206
218
207
cond (A:: LU , p) = inv (LAPACK. gecon! (p == 1 ? ' 1' : ' I' , A. factors, norm (A[:L ][A[:p ],:]* A[:U ], p)))
219
208
220
- # # QR decomposition without column pivots. By the faster geqrt3
209
+ # ###################
210
+ # QR Factorization #
211
+ # ###################
212
+
213
+ # Note. For QR factorization without pivoting, the WY representation based method introduced in LAPACK 3.4
221
214
type QR{S<: BlasFloat } <: Factorization{S}
222
- vs:: Matrix{S} # the elements on and above the diagonal contain the N-by-N upper triangular matrix R; the elements below the diagonal are the columns of V
223
- T:: Matrix{S} # upper triangular factor of the block reflector.
215
+ vs:: Matrix{S}
216
+ T:: Matrix{S}
224
217
end
225
218
QR {T<:BlasFloat} (A:: StridedMatrix{T} , nb:: Integer = min (minimum (size (A)), 36 )) = QR (LAPACK. geqrt! (A, nb)... )
226
219
227
- qrfact! {T<:BlasFloat} (A:: StridedMatrix{T} , args:: Integer... ) = QR (A, args... )
228
- qrfact! (A:: StridedMatrix , args:: Integer... ) = qrfact! (float (A), args... )
229
- qrfact {T<:BlasFloat} (A:: StridedMatrix{T} , args:: Integer... ) = qrfact! (copy (A), args... )
230
- qrfact (A:: StridedMatrix , args:: Integer... ) = qrfact! (float (A), args... )
220
+ type QRPivoted{T} <: Factorization{T}
221
+ hh:: Matrix{T}
222
+ tau:: Vector{T}
223
+ jpvt:: Vector{BlasInt}
224
+ end
225
+
226
+ qrfact! {T<:BlasFloat} (A:: StridedMatrix{T} ; pivot= false ) = pivot ? QRPivoted {T} (LAPACK. geqp3! (A)... ) : QR (A)
227
+ qrfact! (A:: StridedMatrix ; pivot= false ) = qrfact! (float (A), pivot= pivot)
228
+ qrfact {T<:BlasFloat} (A:: StridedMatrix{T} ; pivot= false ) = qrfact! (copy (A), pivot= pivot)
229
+ qrfact (A:: StridedMatrix ; pivot= false ) = qrfact! (float (A), pivot= pivot)
231
230
qrfact (x:: Integer ) = qrfact (float (x))
232
231
qrfact (x:: Number ) = QR (fill (one (x), 1 , 1 ), fill (x, 1 , 1 ))
233
232
234
- function qr (A:: Union(Number, AbstractMatrix) , thin:: Bool = true )
235
- F = qrfact (A)
236
- full (F[:Q ], thin), F[:R ]
233
+ function qr (A:: Union(Number, AbstractMatrix) ; pivot = false , thin:: Bool = true )
234
+ F = qrfact (A, pivot = pivot )
235
+ full (F[:Q ], thin= thin ), F[:R ]
237
236
end
238
237
239
238
size (A:: QR , args:: Integer... ) = size (A. vs, args... )
@@ -253,9 +252,9 @@ QRPackedQ(A::QR) = QRPackedQ(A.vs, A.T)
253
252
size (A:: QRPackedQ , dim:: Integer ) = 0 < dim ? (dim <= 2 ? size (A. vs, 1 ) : 1 ) : throw (BoundsError ())
254
253
size (A:: QRPackedQ ) = size (A, 1 ), size (A, 2 )
255
254
256
- full {T<:BlasFloat} (A:: QRPackedQ{T} , thin:: Bool = true ) = A * (thin ? eye (T, size (A. vs)... ) : eye (T, size (A. vs,1 )))
255
+ full {T<:BlasFloat} (A:: QRPackedQ{T} ; thin:: Bool = true ) = A * (thin ? eye (T, size (A. vs)... ) : eye (T, size (A. vs,1 )))
257
256
258
- print_matrix (io:: IO , A:: QRPackedQ , rows:: Integer , cols:: Integer ) = print_matrix (io, full (A, false ), rows, cols)
257
+ print_matrix (io:: IO , A:: QRPackedQ , rows:: Integer , cols:: Integer ) = print_matrix (io, full (A, thin = false ), rows, cols)
259
258
260
259
# # Multiplication by Q from the QR decomposition
261
260
function * {T<: BlasFloat }(A:: QRPackedQ{T} , B:: StridedVecOrMat{T} )
274
273
\ (A:: QR , B:: StridedVector ) = Triangular (A[:R ], :U )\ (A[:Q ]' B)[1 : size (A, 2 )]
275
274
\ (A:: QR , B:: StridedMatrix ) = Triangular (A[:R ], :U )\ (A[:Q ]' B)[1 : size (A, 2 ),:]
276
275
277
- type QRPivoted{T} <: Factorization{T}
278
- hh:: Matrix{T}
279
- tau:: Vector{T}
280
- jpvt:: Vector{BlasInt}
281
- end
282
-
283
- qrpfact! {T<:BlasFloat} (A:: StridedMatrix{T} ) = QRPivoted {T} (LAPACK. geqp3! (A)... )
284
- qrpfact! (A:: StridedMatrix ) = qrpfact! (float (A))
285
- qrpfact {T<:BlasFloat} (A:: StridedMatrix{T} ) = qrpfact! (copy (A))
286
- qrpfact (A:: StridedMatrix ) = qrpfact! (float (A))
287
-
288
- function qrp (A:: AbstractMatrix , thin:: Bool = false )
289
- F = qrpfact (A)
290
- full (F[:Q ], thin), F[:R ], F[:p ]
291
- end
292
-
293
276
size (A:: QRPivoted , args:: Integer... ) = size (A. hh, args... )
294
277
295
278
function getindex {T<:BlasFloat} (A:: QRPivoted{T} , d:: Symbol )
@@ -345,13 +328,13 @@ QRPivotedQ(A::QRPivoted) = QRPivotedQ(A.hh, A.tau)
345
328
346
329
size (A:: QRPivotedQ , dims:: Integer ) = dims > 0 ? (dims < 3 ? size (A. hh, 1 ) : 1 ) : throw (BoundsError ())
347
330
348
- function full {T<:BlasFloat} (A:: QRPivotedQ{T} , thin:: Bool = true )
331
+ function full {T<:BlasFloat} (A:: QRPivotedQ{T} ; thin:: Bool = true )
349
332
m, n = size (A. hh)
350
333
Ahhpad = thin ? copy (A. hh) : [A. hh zeros (T, m, max (0 , m - n))]
351
334
LAPACK. orgqr! (Ahhpad, A. tau)
352
335
end
353
336
354
- print_matrix (io:: IO , A:: QRPivotedQ , rows:: Integer , cols:: Integer ) = print_matrix (io, full (A, false ), rows, cols)
337
+ print_matrix (io:: IO , A:: QRPivotedQ , rows:: Integer , cols:: Integer ) = print_matrix (io, full (A, thin = false ), rows, cols)
355
338
356
339
# # Multiplication by Q from the Pivoted QR decomposition
357
340
function * {T<: BlasFloat }(A:: QRPivotedQ{T} , B:: StridedVecOrMat{T} )
0 commit comments