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?

`cos(0)=1`

which means you need to store everything.

1 Like

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?

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

.

```
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

```
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
```

1 Like