@@ -39,19 +39,47 @@ function sweep_with_buffer!(akk::AVec{T}, A::AMat{T}, k::Integer, inv::Bool = fa
39
39
1 ≤ k ≤ p || throw (BoundsError (A, k))
40
40
p == length (akk) || throw (DimensionError (" Incorrect buffer size." ))
41
41
@inbounds @views begin
42
- d = one (T) / A[k, k] # pivot
43
- copy! (akk, Symmetric (A, :U )[:, k]) # akk = A[:, k]
44
- if A isa StridedMatrix{<: Union{LinearAlgebra.BlasFloat, LinearAlgebra.BlasComplex} }
45
- BLAS. syrk! (' U' , ' N' , - d, akk, one (T), A) # everything not in col/row k
46
- else
47
- A .+ = UpperTriangular (- d * akk * akk' )
48
- end
49
- rmul! (akk, d * (- one (T)) ^ inv) # akk .* d (negated if inv=true)
50
- copy! (A[1 : k- 1 ,k], akk[1 : k- 1 ]) # col k
51
- copy! (A[k, k+ 1 : end ], akk[k+ 1 : end ]) # row k
52
- A[k, k] = - d # pivot element
42
+ d = one (T) / A[k, k] # pivot
43
+ copy! (akk, Symmetric (A, :U )[:, k]) # akk = A[:, k]
44
+ syrk! (A, - d, akk) # everything not in row/col k
45
+ rmul! (akk, d * (- one (T)) ^ inv) # akk .* d (negated if inv=true)
46
+ setrowcol! (A, k, akk)
47
+ A[k, k] = - d # pivot element
53
48
end
54
49
return A
55
50
end
56
51
52
+ # -----------------------------------------------------------------------------# setrowcol!
53
+ # Set upper triangle of: (A[k, :] = x; A[:, k] = x)
54
+ function setrowcol! (A:: StridedArray , k, x)
55
+ @views copy! (A[1 : k- 1 ,k], x[1 : k- 1 ]) # col k
56
+ @views copy! (A[k, k+ 1 : end ], x[k+ 1 : end ]) # row k
57
+ end
58
+
59
+ setrowcol! (A:: Union{Hermitian,Symmetric,UpperTriangular} , k, x) = setrowcol! (A. data, k, x)
60
+
61
+ # -----------------------------------------------------------------------------# syrk!
62
+ const BlasNumber = Union{LinearAlgebra. BlasFloat, LinearAlgebra. BlasComplex}
63
+
64
+ # In-place update of (the upper triangle of) A + α * x * x'
65
+ function syrk! (A:: StridedMatrix{T} , α:: T , x:: AbstractArray{<:T} ) where {T<: BlasNumber }
66
+ BLAS. syrk! (' U' , ' N' , α, x, one (T), A)
67
+ end
68
+
69
+ function syrk! (A:: Hermitian{T, S} , α:: T , x:: AbstractArray{<:T} ) where {T<: BlasNumber , S<: StridedMatrix{T} }
70
+ Hermitian (BLAS. syrk! (' U' , ' N' , α, x, one (T), A. data))
71
+ end
72
+
73
+ function syrk! (A:: Symmetric{T, S} , α:: T , x:: AbstractArray{<:T} ) where {T<: BlasNumber , S<: StridedMatrix{T} }
74
+ Symmetric (BLAS. syrk! (' U' , ' N' , α, x, one (T), A. data))
75
+ end
76
+
77
+ function syrk! (A, α, x) where {T}
78
+ p = checksquare (A)
79
+ for i in 1 : p, j in i: p
80
+ @inbounds A[i,j] += α * x[i] * x[j]
81
+ end
82
+ end
83
+
84
+
57
85
end # module
0 commit comments