# Circshift of a SparseMatrix

**URL:** <https://discourse.julialang.org/t/circshift-of-a-sparsematrix/18420>\
**Category:** Internals & Design\
**Created:** [December 7, 2018, 1:57pm UTC](https://discourse.julialang.org/t/circshift-of-a-sparsematrix/18420 "2018-12-07T13:57:13Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![abraunst](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/abraunst/32/6880_2.png) [@abraunst](https://discourse.julialang.org/u/abraunst)\
**Post date:** [December 7, 2018, 1:57pm UTC](https://discourse.julialang.org/t/circshift-of-a-sparsematrix/18420/1 "2018-12-07T13:57:13Z")

</div>

Right now, circshift falls back to the generic AbstractMatrix implementation when called with a SparseMatrix (being very slow and adding unnecessary structural zeros values in the output).

Adding something simple like the following seems to do the job. So… what is the best way to get it added?

```julia
function circshift!(O::SparseMatrixCSC, X::SparseMatrixCSC, (r,c)::Tuple{T,T}) where T<:Int
    I,J,V = findnz(X)
    O .= sparse(map(i->mod1(i + r, X.n), I), map(j->mod1(j + c, X.m), J), V, X.n, X.m)
end

```

---

<div class="post-metadata">

**Author:** ![mauro3](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mauro3/32/292_2.png) [@mauro3](https://discourse.julialang.org/u/mauro3)\
**Post date:** [December 7, 2018, 2:04pm UTC](https://discourse.julialang.org/t/circshift-of-a-sparsematrix/18420/2 "2018-12-07T14:04:58Z")

</div>

Submit a pull request: [Pull requests · JuliaLang/julia · GitHub](https://github.com/JuliaLang/julia/pulls).

You’d add the function to one of the files in [https://github.com/JuliaLang/julia/tree/master/stdlib/SparseArrays/src](https://github.com/JuliaLang/julia/tree/master/stdlib/SparseArrays/src).

You should also add tests to [https://github.com/JuliaLang/julia/tree/master/stdlib/SparseArrays/test](https://github.com/JuliaLang/julia/tree/master/stdlib/SparseArrays/test).

---

<div class="post-metadata">

**Author:** ![abraunst](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/abraunst/32/6880_2.png) [@abraunst](https://discourse.julialang.org/u/abraunst)\
**Post date:** [December 7, 2018, 2:40pm UTC](https://discourse.julialang.org/t/circshift-of-a-sparsematrix/18420/3 "2018-12-07T14:40:51Z")

</div>

Thanks, will try to do so!  
A

---

<div class="post-metadata">

**Author:** ![mauro3](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mauro3/32/292_2.png) [@mauro3](https://discourse.julialang.org/u/mauro3)\
**Post date:** [December 7, 2018, 2:51pm UTC](https://discourse.julialang.org/t/circshift-of-a-sparsematrix/18420/4 "2018-12-07T14:51:50Z")

</div>

Cool, thanks! Post a link to your PR here.

---

<div class="post-metadata">

**Author:** ![abraunst](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/abraunst/32/6880_2.png) [@abraunst](https://discourse.julialang.org/u/abraunst)\
**Post date:** [December 7, 2018, 5:18pm UTC](https://discourse.julialang.org/t/circshift-of-a-sparsematrix/18420/5 "2018-12-07T17:18:39Z")

</div>

Here it is  
[https://github.com/JuliaLang/julia/pull/30300](https://github.com/JuliaLang/julia/pull/30300)

---

<div class="post-metadata">

**Author:** ![abraunst](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/abraunst/32/6880_2.png) [@abraunst](https://discourse.julialang.org/u/abraunst)\
**Post date:** [December 8, 2018, 2:31pm UTC](https://discourse.julialang.org/t/circshift-of-a-sparsematrix/18420/6 "2018-12-08T14:31:01Z")

</div>

More obscure but more efficient version in this PR  
[https://github.com/JuliaLang/julia/pull/30317](https://github.com/JuliaLang/julia/pull/30317)
