# SVD solver for Sparse Matrices

**URL:** https://discourse.julialang.org/t/svd-solver-for-sparse-matrices/88246
**Category:** General Usage
**Tags:** question
**Created:** [October 4, 2022, 5:53pm UTC](https://discourse.julialang.org/t/svd-solver-for-sparse-matrices/88246 "2022-10-04T17:53:30Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![nosewitz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nosewitz/32/39014_2.png) [@nosewitz](https://discourse.julialang.org/u/nosewitz)
#### Post date: [October 4, 2022, 5:53pm UTC](https://discourse.julialang.org/t/svd-solver-for-sparse-matrices/88246/1 "2022-10-04T17:53:31Z")

</div>

I want to use singular value decomposition on large sparse matrices (18,000 x 8,000) and while the built-in LinearAlgebra function does the trick, it does not operate on the SparseMatrix type. My current solution is just converting it into a dense matrix and then calling the function, but as expected, it takes a long time.

Is there an existing package or option to use SVD with a sparse matrix or maybe only get the Kth largest Uk Sk V’k from an input?

Thanks in advance!

---

<div class="post-metadata">

### Author: ![amontoison](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/amontoison/32/218741_2.png) [@amontoison](https://discourse.julialang.org/u/amontoison)
#### Post date: [October 4, 2022, 6:04pm UTC](https://discourse.julialang.org/t/svd-solver-for-sparse-matrices/88246/2 "2022-10-04T18:04:06Z")

</div>

You could use [PROPACK.jl](https://github.com/JuliaSmoothOptimizers/PROPACK.jl), it works if `A` is a SparseMatrixCSC or a linear operator.

---

<div class="post-metadata">

### Author: ![Arrigo\_Benedetti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/arrigo_benedetti/32/25545_2.png) [@Arrigo\_Benedetti](https://discourse.julialang.org/u/Arrigo_Benedetti)
#### Post date: [October 4, 2022, 6:12pm UTC](https://discourse.julialang.org/t/svd-solver-for-sparse-matrices/88246/3 "2022-10-04T18:12:30Z")

</div>

I’m not sure it provides a function to compute the SVD, however you may want to check [SuiteSparse](https://github.com/DrTimothyAldenDavis/SuiteSparse).

---

<div class="post-metadata">

### Author: ![nosewitz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nosewitz/32/39014_2.png) [@nosewitz](https://discourse.julialang.org/u/nosewitz)
#### Post date: [October 4, 2022, 6:14pm UTC](https://discourse.julialang.org/t/svd-solver-for-sparse-matrices/88246/4 "2022-10-04T18:14:13Z")

</div>

I downloaded the package and did the setup but I’m getting this strange error below. Not really sure why since I’m following the documentation steps.

```julia
(TextHW2) julia> train_mat.dtm |> typeof
SparseArrays.SparseMatrixCSC{Int64, Int64}

(TextHW2) julia> train_mat.dtm |> size
(18000, 7666)

(TextHW2) julia> tsvd(train_mat.dtm; k = 1)
ERROR: MethodError: no method matching eps(::Int64)
Closest candidates are:
  eps() at float.jl:831
  eps(::AbstractFloat) at float.jl:827
  eps(::T) where T<:Dates.TimeType at C:\Users\aledo\.julia\juliaup\julia-1.8.1+0.x64\share\julia\stdlib\v1.8\Dates\src\types.jl:444
  ...
Stacktrace:
 [1] tsvd(A::SparseArrays.SparseMatrixCSC{Int64, Int64}; kwargs::Base.Pairs{Symbol, Int64, Tuple{Symbol}, NamedTuple{(:k,), Tuple{Int64}}})
   @ PROPACK C:\Users\aledo\.julia\packages\PROPACK\0cIiC\src\PROPACK.jl:216
 [2] top-level scope
   @ REPL[102]:1

(TextHW2) julia>

```

---

<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: [October 4, 2022, 6:17pm UTC](https://discourse.julialang.org/t/svd-solver-for-sparse-matrices/88246/5 "2022-10-04T18:17:03Z")

</div>

Your matrix has an integer data type. I don’t think SuiteSparse is capable of handling that.

---

<div class="post-metadata">

### Author: ![nosewitz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nosewitz/32/39014_2.png) [@nosewitz](https://discourse.julialang.org/u/nosewitz)
#### Post date: [October 4, 2022, 6:19pm UTC](https://discourse.julialang.org/t/svd-solver-for-sparse-matrices/88246/6 "2022-10-04T18:19:44Z")

</div>

Should I convert its contents to floats (eg 1 → 1.0) then?

---

<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: [October 4, 2022, 6:20pm UTC](https://discourse.julialang.org/t/svd-solver-for-sparse-matrices/88246/7 "2022-10-04T18:20:00Z")

</div>

I would.

---

<div class="post-metadata">

### Author: ![nosewitz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nosewitz/32/39014_2.png) [@nosewitz](https://discourse.julialang.org/u/nosewitz)
#### Post date: [October 4, 2022, 6:23pm UTC](https://discourse.julialang.org/t/svd-solver-for-sparse-matrices/88246/8 "2022-10-04T18:23:18Z")

</div>

That did the trick, thank you!
