# Broadcasting trig functions to SparseArrays.SparseMatrixCSC

**URL:** <https://discourse.julialang.org/t/broadcasting-trig-functions-to-sparsearrays-sparsematrixcsc/38570>\
**Category:** General Usage\
**Tags:** question\
**Created:** [May 1, 2020, 5:54pm UTC](https://discourse.julialang.org/t/broadcasting-trig-functions-to-sparsearrays-sparsematrixcsc/38570 "2020-05-01T17:54:35Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![woochangchung](https://avatars.discourse-cdn.com/v4/letter/w/e56c9b/32.png) [@woochangchung](https://discourse.julialang.org/u/woochangchung)\
**Post date:** [May 1, 2020, 5:54pm UTC](https://discourse.julialang.org/t/broadcasting-trig-functions-to-sparsearrays-sparsematrixcsc/38570/1 "2020-05-01T17:54:35Z")

</div>

I have noticed some difference in behaviors when broadcasting trig functions to `SparseArrays.SparseMatrixCSC` objects. Here is an example.

Let x be a `SparseArrays.SparseMatrixCSC{Complex{Float64},Int64}` object.  
It has 1000 rows and 1000 columns, with 1000 non-zero values on the diagonal.

If I try `sin.(x)`, broadcasting works correctly and the output has only 1000 non-zero values.

However, if I try `cos.(x)`, broadcasting does not work as intended, as the output has non-zero value everywhere in the 1000x1000 array. Why?

---

<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:** [May 1, 2020, 5:56pm UTC](https://discourse.julialang.org/t/broadcasting-trig-functions-to-sparsearrays-sparsematrixcsc/38570/2 "2020-05-01T17:56:28Z")

</div>

`cos(0)=1` which means you need to store everything.

---

<div class="post-metadata">

**Author:** ![woochangchung](https://avatars.discourse-cdn.com/v4/letter/w/e56c9b/32.png) [@woochangchung](https://discourse.julialang.org/u/woochangchung)\
**Post date:** [May 1, 2020, 5:58pm UTC](https://discourse.julialang.org/t/broadcasting-trig-functions-to-sparsearrays-sparsematrixcsc/38570/3 "2020-05-01T17:58:16Z")

</div>

I see, somehow I thought broadcasting will only apply to non-zero values. Then what would be an appropriate fix to get what I want?

---

<div class="post-metadata">

**Author:** ![eliassno](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/eliassno/32/18917_2.png) [@eliassno](https://discourse.julialang.org/u/eliassno)\
**Post date:** [May 1, 2020, 6:24pm UTC](https://discourse.julialang.org/t/broadcasting-trig-functions-to-sparsearrays-sparsematrixcsc/38570/4 "2020-05-01T18:24:52Z")

</div>

You can explicitly broadcast over the non-zero values, `x.nzval`.

```julia
using LinearAlgebra, SparseArrays
using Random
Random.seed!(1)

N = 4
x = sparse(Diagonal(rand(ComplexF64,N)))

println("Original")
println(x,"\n")

@. x.nzval = cos(x.nzval)

println("Broadcast cos")
println(x)

```

which prints out

```julia
Original

  [1, 1] = 0.236033+0.346517im
  [2, 2] = 0.312707+0.00790928im
  [3, 3] = 0.488613+0.210968im
  [4, 4] = 0.951916+0.999905im

Broadcast cos

  [1, 1] = 1.03123-0.0826637im
  [2, 2] = 0.951534-0.0024332im
  [3, 3] = 0.902708-0.099765im
  [4, 4] = 0.895112-0.957115im

```
