Sometimes, it is necessary to convert a UniformScaling to an actual matrix of values. In these cases, I call some form of Matrix(I, n, n).
While this is not that bad, it can make otherwise very readable code slightly less so. However with call overloading, it is possible to emulate the old functionality of eye when necessary:
(I::UniformScaling)(T::DataType, n::Integer, m::Integer) = Matrix(one(T)*I, n, m)
(I::UniformScaling)(T::DataType, n::Integer) = I(T, n, n)
(I::UniformScaling)(n::Integer, m::Integer) = I(Bool, n, m)
(I::UniformScaling)(n::Integer) = I(n, n)
julia> I(3)
3×3 Array{Bool,2}:
true false false
false true false
false false true
julia> I(Int8, 2)
2×2 Array{Int8,2}:
1 0
0 1
I am not aware of all of the reasons for eliminating eye in favor of I (not that I’m complaining!) but since it is inevitable to sometimes need hard values, I think this could be a convenient addition to LinearAgebra.