CM1
1
Hi everyone,
I am quite confused about the resulting types in below snippet:
N = 5
T = Float32
# edit, forgot to mention these variables
μ = rand(T, N_states, 1)
σ = rand(T, N_states, 1)
E₀ = fill(T(0.5), N, 1) # 5×1 Matrix{Float32}
U₀_1 = @. ((1 - μ) * σ) * E₀ # 5×1 Matrix{Float32}
U₀_2 = @. (1 - μ) * σ * fill(T(0.5), N, 1) # 5×1 Matrix{Matrix{Float32}}
Can someone please explain why U₀_2
has a different type than U₀_1
, despite typeof(fill(T(0.5), N_states, 1))
being equal to typeof(E₀)
?
I can’t reproduce on julia 1.10.2
but I guess this is because @.
applies to fill
as well. Can you try U₀_2 = fill(T(0.5), N, 1) .* (@. (1 - μ) * σ)
?
2 Likes
sgaure
3
What is μ
and σ
? And which version of julia are you running?
1 Like
CM1
4
@sgaure Oops, my bad, I added the variables to the MWE
@artemsolod It seems you are correct, your variant works on Julia 1.9.3, too
Thanks for the answers!
sgaure
5
Yes, it’s the difference between
julia> ((1 .- μ) .* σ) .* fill(T(0.5), N, 1)
5×1 Matrix{Float32}:
and
julia> ((1 .- μ) .* σ) .* fill.(T(0.5), N, 1)
5×1 Matrix{Matrix{Float32}}:
where the broadcasts are fused, and the fill
broadcast computes fill(T(0.5),N,1)
every time. I agree it’s a bit unexpected.
1 Like
It appears broadcast can be escaped with $
:
julia> @. fill(1., (1,2))
([1.0], [1.0, 1.0])
julia> @. $fill(1., (1,2))
1×2 Matrix{Float64}:
1.0 1.0
Great post: Broadcasting in Julia: the Good, the Bad, and the Ugly | Blog by Bogumił Kamiński
1 Like