Skip to content

Commit 7549fea

Browse files
committed
add SVD * X
1 parent e9328eb commit 7549fea

File tree

2 files changed

+15
-7
lines changed

2 files changed

+15
-7
lines changed

src/svd.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,10 @@ function inv(F::SVD)
320320
return @views (F.S[1:k] .\ F.Vt[1:k, :])' * F.U[:,1:k]'
321321
end
322322

323+
# multiplying SVD by matrix/vector, mainly useful for pinv(::SVD) output
324+
(*)(F::SVD, A::AbstractVecOrMat{<:Number}) = F.U * (Diagonal(F.S) * (F.Vt * A))
325+
(*)(A::AbstractMatrix{<:Number}, F::SVD) = ((A*F.U) * Diagonal(F.S)) * F.Vt
326+
323327
size(A::SVD, dim::Integer) = dim == 1 ? size(A.U, dim) : size(A.Vt, dim)
324328
size(A::SVD) = (size(A, 1), size(A, 2))
325329

test/svd.jl

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -239,15 +239,19 @@ end
239239
@testset "SVD pinv and truncation" begin
240240
m, n = 10,5
241241
A = randn(m,n) * [1/(i+j-1) for i = 1:n, j=1:n] # badly conditioned Hilbert matrix
242-
@test pinv(A) Matrix(pinv(svd(A))) rtol=1e-13
242+
F = svd(A)
243+
@test pinv(A) Matrix(pinv(F)) rtol=1e-13
243244
pinv_3 = pinv(A, rtol=1e-3)
244-
@test pinv_3 Matrix(pinv(svd(A), rtol=1e-3)) rtol=1e-13
245-
@test pinv_3 Matrix(pinv(svd(A, rtol=1e-3))) rtol=1e-13
245+
F_3 = svd(A, rtol=1e-3)
246+
@test pinv_3 Matrix(pinv(F, rtol=1e-3)) rtol=1e-13
247+
@test pinv_3 Matrix(pinv(F_3)) rtol=1e-13
246248
b = float([1:m;]) # arbitrary rhs
247-
@test pinv_3 * b svd(A, rtol=1e-3) \ b rtol=1e-13
248-
@test pinv_3 * b pinv(svd(A, rtol=1e-3)) * b rtol=1e-13
249-
@test pinv_3 * b ldiv!(svd(A), copy(b), rtol=1e-3)[1:n] rtol=1e-13
250-
@test pinv(A, atol=100) == Matrix(pinv(svd(A), atol=100)) == Matrix(pinv(svd(A, atol=100))) == zeros(5,10)
249+
@test pinv_3 * b F_3 \ b rtol=1e-13
250+
@test pinv_3 * b pinv(F_3) * b rtol=1e-13
251+
@test pinv_3 * b ldiv!(F, copy(b), rtol=1e-3)[1:n] rtol=1e-13
252+
c = float([1:n;]) # arbitrary rhs
253+
@test c' * pinv_3 c' * pinv(F_3) rtol=1e-13
254+
@test pinv(A, atol=100) == Matrix(pinv(F, atol=100)) == Matrix(pinv(svd(A, atol=100))) == zeros(5,10)
251255
end
252256

253257
@testset "Issue 40944. ldiv!(SVD) should update rhs" begin

0 commit comments

Comments
 (0)