# Bug in LinearAlgebra pinv()

**URL:** <https://discourse.julialang.org/t/bug-in-linearalgebra-pinv/76663>\
**Category:** General Usage\
**Tags:** linearalgebra\
**Created:** [February 18, 2022, 1:04am UTC](https://discourse.julialang.org/t/bug-in-linearalgebra-pinv/76663 "2022-02-18T01:04:53Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![rwyoung7](https://avatars.discourse-cdn.com/v4/letter/r/a3d4f5/32.png) [@rwyoung7](https://discourse.julialang.org/u/rwyoung7)\
**Post date:** [February 18, 2022, 1:04am UTC](https://discourse.julialang.org/t/bug-in-linearalgebra-pinv/76663/1 "2022-02-18T01:04:53Z")

</div>

A = [1.0 0.0;0.0 1.0;0.0 0.0]

A1 = pinv(A):  
[1.0 0.0 1.0;0.0 0.0 0.0] wrong  
A1\*A  
[1.0 0.0;0.0 0.0] wrong

A2 = inv(A’\*A)_A’:  
[1.0 0.0 0.0;0.0 1.0 0.0] correct  
A2_A  
[1.0 0.0;0.0 1.0] correct

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [February 18, 2022, 1:16am UTC](https://discourse.julialang.org/t/bug-in-linearalgebra-pinv/76663/2 "2022-02-18T01:16:22Z")

</div>

Agreed, it looks like a bug:

```julia
julia> SVD = svd(A)
LinearAlgebra.SVD{Float64, Float64, Matrix{Float64}}
U factor:
3×2 Matrix{Float64}:
 1.00000e+00 0.00000e+00
 0.00000e+00 1.00000e+00
 0.00000e+00 0.00000e+00
singular values:
2-element Vector{Float64}:
 1.00000e+00
 1.00000e+00
Vt factor:
2×2 Matrix{Float64}:
 1.00000e+00 0.00000e+00
 0.00000e+00 1.00000e+00

julia> (SVD.Vt * Diagonal(SVD.S)) * SVD.U' * A
2×2 Matrix{Float64}:
 1.00000e+00 0.00000e+00
 0.00000e+00 1.00000e+00

```

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [February 18, 2022, 1:22am UTC](https://discourse.julialang.org/t/bug-in-linearalgebra-pinv/76663/3 "2022-02-18T01:22:17Z")

</div>

Can you spot it? [https://github.com/JuliaLang/julia/blob/bf534986350a991e4a1b29126de0342ffd76205e/stdlib/LinearAlgebra/src/dense.jl#L1427](https://github.com/JuliaLang/julia/blob/bf534986350a991e4a1b29126de0342ffd76205e/stdlib/LinearAlgebra/src/dense.jl#L1427)

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [February 18, 2022, 2:27am UTC](https://discourse.julialang.org/t/bug-in-linearalgebra-pinv/76663/4 "2022-02-18T02:27:34Z")

</div>

OK, a hint: is `A` diagonal?

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [February 18, 2022, 3:30am UTC](https://discourse.julialang.org/t/bug-in-linearalgebra-pinv/76663/5 "2022-02-18T03:30:01Z")

</div>

We should fix this bug, but it’s worth noting that you should pretty much never use `pinv`. Doing linear solves directly is pretty much always better.

---

<div class="post-metadata">

**Author:** ![rwyoung7](https://avatars.discourse-cdn.com/v4/letter/r/a3d4f5/32.png) [@rwyoung7](https://discourse.julialang.org/u/rwyoung7)\
**Post date:** [February 18, 2022, 4:12am UTC](https://discourse.julialang.org/t/bug-in-linearalgebra-pinv/76663/6 "2022-02-18T04:12:23Z")

</div>

Right, but I am actually computing a projection matrix which will be used many times.

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [February 18, 2022, 4:18am UTC](https://discourse.julialang.org/t/bug-in-linearalgebra-pinv/76663/7 "2022-02-18T04:18:06Z")

</div>

then call `factorize(A)` and reuse that.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [February 18, 2022, 4:50am UTC](https://discourse.julialang.org/t/bug-in-linearalgebra-pinv/76663/8 "2022-02-18T04:50:11Z")

</div>

[https://github.com/JuliaLang/julia/issues/44234](https://github.com/JuliaLang/julia/issues/44234)

---

<div class="post-metadata">

**Author:** ![jd-foster](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jd-foster/32/35824_2.png) [@jd-foster](https://discourse.julialang.org/u/jd-foster)\
**Post date:** [February 18, 2022, 4:54am UTC](https://discourse.julialang.org/t/bug-in-linearalgebra-pinv/76663/9 "2022-02-18T04:54:23Z")

</div>

The internal part of `pinv` is just the SVD, as the above posts show.  
So you might want to look at using `svd(A)` and using the SVD factors to construct your projection.

---

<div class="post-metadata">

**Author:** ![rwyoung7](https://avatars.discourse-cdn.com/v4/letter/r/a3d4f5/32.png) [@rwyoung7](https://discourse.julialang.org/u/rwyoung7)\
**Post date:** [February 18, 2022, 12:06pm UTC](https://discourse.julialang.org/t/bug-in-linearalgebra-pinv/76663/10 "2022-02-18T12:06:13Z")

</div>

Thank you.
