From f93895926e3a61d992a058cfc199b74371ee2d36 Mon Sep 17 00:00:00 2001 From: Andreas Noack Date: Tue, 30 Oct 2018 11:12:32 +0100 Subject: [PATCH] Make pinv work for Adjoint (#29837) Fixes #29723 (cherry picked from commit a472bc720940d51796bf63b38a82a352032a89a7) --- stdlib/LinearAlgebra/src/dense.jl | 4 ++-- stdlib/LinearAlgebra/test/dense.jl | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/stdlib/LinearAlgebra/src/dense.jl b/stdlib/LinearAlgebra/src/dense.jl index b312782ed7dcd..8e1c19eddb65b 100644 --- a/stdlib/LinearAlgebra/src/dense.jl +++ b/stdlib/LinearAlgebra/src/dense.jl @@ -1240,7 +1240,7 @@ julia> M * N [^KY88]: Konstantinos Konstantinides and Kung Yao, "Statistical analysis of effective singular values in matrix rank determination", IEEE Transactions on Acoustics, Speech and Signal Processing, 36(5), 1988, 757-763. [doi:10.1109/29.1585](https://doi.org/10.1109/29.1585) """ -function pinv(A::StridedMatrix{T}, rtol::Real) where T +function pinv(A::AbstractMatrix{T}, rtol::Real) where T m, n = size(A) Tout = typeof(zero(T)/sqrt(one(T) + one(T))) if m == 0 || n == 0 @@ -1269,7 +1269,7 @@ function pinv(A::StridedMatrix{T}, rtol::Real) where T Sinv[findall(.!isfinite.(Sinv))] .= zero(Stype) return SVD.Vt' * (Diagonal(Sinv) * SVD.U') end -function pinv(A::StridedMatrix{T}) where T +function pinv(A::AbstractMatrix{T}) where T rtol = eps(real(float(one(T))))*min(size(A)...) return pinv(A, rtol) end diff --git a/stdlib/LinearAlgebra/test/dense.jl b/stdlib/LinearAlgebra/test/dense.jl index ae935b6337b59..4d3f1a9b470b4 100644 --- a/stdlib/LinearAlgebra/test/dense.jl +++ b/stdlib/LinearAlgebra/test/dense.jl @@ -87,6 +87,9 @@ bimg = randn(n,2)/2 pinva15 = pinv(a[:,1:n1]) @test a[:,1:n1]*pinva15*a[:,1:n1] ≈ a[:,1:n1] @test pinva15*a[:,1:n1]*pinva15 ≈ pinva15 + pinva15 = pinv(a[:,1:n1]') # the Adjoint case + @test a[:,1:n1]'*pinva15*a[:,1:n1]' ≈ a[:,1:n1]' + @test pinva15*a[:,1:n1]'*pinva15 ≈ pinva15 @test size(pinv(Matrix{eltya}(undef,0,0))) == (0,0) end