fixes
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
module thinQR
|
||||
|
||||
import Base: size, show, getproperty, getfield, propertynames, \, *
|
||||
using LinearAlgebra: norm, I, triu, diagm, ldiv!
|
||||
using LinearAlgebra: norm, I, triu, diagm, ldiv!, dot
|
||||
|
||||
export QRthin, qrhous!, qyhous, qyhoust
|
||||
|
||||
@ -18,16 +18,22 @@ function qrhous!(A::AbstractMatrix{T})::QRthin{T} where T
|
||||
m, n = size(A)
|
||||
|
||||
d = zeros(n)
|
||||
for j ∈ 1:n
|
||||
s = norm(A[j:m, j])
|
||||
# iszero(s) && throw(ArgumentError("The matrix A is singular"))
|
||||
d[j]= copysign(s, -A[j,j])
|
||||
fak = sqrt(s * (s + abs(A[j,j])))
|
||||
A[j,j] -= d[j]
|
||||
A[j:m, j] ./= fak
|
||||
@inbounds begin
|
||||
for j ∈ 1:n
|
||||
s = norm(A[j:m, j])
|
||||
# iszero(s) && throw(ArgumentError("The matrix A is singular"))
|
||||
d[j]= copysign(s, -A[j,j])
|
||||
fak = sqrt(s * (s + abs(A[j,j])))
|
||||
A[j,j] -= d[j]
|
||||
|
||||
A[j:m, j] ./= fak
|
||||
|
||||
if j < n
|
||||
A[j:m, j+1:n] -= A[j:m, j] * (A[j:m, j]' * A[j:m, j+1:n])
|
||||
if j < n
|
||||
A[j:m, j+1:n] -= A[j:m, j] * (A[j:m, j]' * A[j:m, j+1:n])
|
||||
#for k ∈ j+1:n
|
||||
# A[j:m, k] -= A[j:m, j] .* dot(A[j:m, j], A[j:m, k])
|
||||
#end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -47,7 +53,8 @@ function qyhoust(A::QRthin{T}, y::AbstractArray{T}) where T
|
||||
m, n = size(A.A)
|
||||
z = deepcopy(y)
|
||||
for j ∈ 1:n
|
||||
z[j:m] = z[j:m] - A.A[j:m, j] * (A.A[j:m, j]' * z[j:m])
|
||||
# z[j:m] = z[j:m] - A.A[j:m, j] * (A.A[j:m, j]' * z[j:m])
|
||||
z[j:m] -= A.A[j:m, j] .* dot(A.A[j:m, j], z[j:m])
|
||||
end
|
||||
return z
|
||||
end
|
||||
@ -101,7 +108,7 @@ function (\)(A::QRthin{T}, b::AbstractVector{T}) where T
|
||||
v = qyhoust(A, b)
|
||||
x = zeros(m)
|
||||
for j ∈ m:-1:1
|
||||
x[j] = (v[j] - x[j+1:m]' * A.A[j, j+1:m]) * A.d[j]^-1
|
||||
x[j] = (v[j] - dot(x[j+1:m], A.A[j, j+1:m])) * A.d[j]^-1
|
||||
end
|
||||
return x
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user