@@ -125,7 +125,7 @@ size(B::BunchKaufman, d::Integer) = size(getfield(B, :LD), d)
125
125
issymmetric (B:: BunchKaufman ) = B. symmetric
126
126
ishermitian (B:: BunchKaufman ) = ! B. symmetric
127
127
128
- function _ipiv2perm_bk (v:: AbstractVector{T} , maxi:: Integer , uplo:: AbstractChar ) where T
128
+ function _ipiv2perm_bk (v:: AbstractVector{T} , maxi:: Integer , uplo:: AbstractChar , rook :: Bool ) where T
129
129
require_one_based_indexing (v)
130
130
p = T[1 : maxi;]
131
131
uploL = uplo == ' L'
@@ -137,11 +137,16 @@ function _ipiv2perm_bk(v::AbstractVector{T}, maxi::Integer, uplo::AbstractChar)
137
137
p[i], p[vi] = p[vi], p[i]
138
138
i += uploL ? 1 : - 1
139
139
else # the 2x2 blocks
140
+ if rook
141
+ p[i], p[- vi] = p[- vi], p[i]
142
+ end
140
143
if uploL
141
- p[i + 1 ], p[- vi] = p[- vi], p[i + 1 ]
144
+ vp = rook ? - v[i+ 1 ] : - vi
145
+ p[i + 1 ], p[vp] = p[vp], p[i + 1 ]
142
146
i += 2
143
147
else # 'U'
144
- p[i - 1 ], p[- vi] = p[- vi], p[i - 1 ]
148
+ vp = rook ? - v[i- 1 ] : - vi
149
+ p[i - 1 ], p[vp] = p[vp], p[i - 1 ]
145
150
i -= 2
146
151
end
147
152
end
@@ -208,7 +213,7 @@ julia> F.U*F.D*F.U' - F.P*A*F.P'
208
213
function getproperty (B:: BunchKaufman{T} , d:: Symbol ) where {T<: BlasFloat }
209
214
n = size (B, 1 )
210
215
if d == :p
211
- return _ipiv2perm_bk (getfield (B, :ipiv ), n, getfield (B, :uplo ))
216
+ return _ipiv2perm_bk (getfield (B, :ipiv ), n, getfield (B, :uplo ), B . rook )
212
217
elseif d == :P
213
218
return Matrix {T} (I, n, n)[:,invperm (B. p)]
214
219
elseif d == :L || d == :U || d == :D
0 commit comments