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.