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