I would like to write a function that checks whether the rows of a stochastic matrix sum to 1 and throws an error if they do not.
The following code works for a check by hand:
sum(mat,dims = 2)
But this code does not work. It falsely flags all matrixes as not summing to 1, even “good” matrixes.
stoch_mat_check(mat) = any(x -> x != 1.0,sum(mat,dims = 2)) : error("ERROR: rows dont sum one")
mat = [.5,.5]
stoch_mat_check(mat)
Returns
ERROR: rows dont sum one
Stacktrace:
[1] error(s::String)
@ Base ./error.jl:33
[2] stoch_mat_check(mat::Vector{Float64})
@ Main ./In[231]:18
[3] top-level scope
@ In[231]:21
[4] eval
@ ./boot.jl:373 [inlined]
[5] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)
@ Base ./loading.jl:1196
odow
2
Two points.
- This isn’t doing what you think it’s doing:
Julia> mat = [0.5, 0.5]
2-element Vector{Float64}:
0.5
0.5
julia> sum(mat, dims = 2)
2-element Vector{Float64}:
0.5
0.5
julia> mat = [0.5 0.5]
1×2 Matrix{Float64}:
0.5 0.5
julia> sum(mat; dims = 2)
1×1 Matrix{Float64}:
1.0
Note the different definition of mat
.
- Never use exact comparisons.
julia> 3 * 0.1 == 0.3
false
Use isapprox(3 * 0.1, 0.3)
instead: Getting started with Julia · JuMP
“mat” is vector, not matrix, it will acts like a row vector.
julia> mat
2-element Vector{Float64}:
0.5
0.5
julia> sum(mat, dims=2)
2-element Vector{Float64}:
0.5
0.5
You can initialize a matrix with spaces instead of comma.
julia> mat = [0.5 0.5]
1×2 Matrix{Float64}:
0.5 0.5
julia> stoch_mat_check(mat)
false
2 Likes
Thank you! But this still returns the error:
#quick check:
stoch_mat_check(mat) = any(x -> !(isapprox(x,1)),sum(mat,dims = 2)) : error("ERROR: rows dont sum one")
mat = [.5 .5]
stoch_mat_check(mat)
oh yea, I forgot to mention, I think you meant to use &&
short-circuit.
stoch_mat_check(mat) = any(x -> x != 1.0,sum(mat,dims = 2)) && error("ERROR: rows dont sum one")
If you want ternary, you are missing the ?
and statement for true
stoch_mat_check(mat) = any(x -> x != 1.0,sum(mat,dims = 2)) ? error("ERROR: rows dont sum one") : print("all good")
2 Likes
oh thank you, that’s it!! This is my first time making an error function.
1 Like