OK – I tested it:
julia> M1 = Eye{Int}(5);
julia> M2 = I(5);
julia> M3 = Diagonal(fill(1,5));
julia> sizeof(M1), sizeof(M2), sizeof(M3)
(8, 8, 8)
julia> sizeof(M1.diag), sizeof(M2.diag), sizeof(M3.diag)
(8, 5, 40)
… and then I tested it more:
julia> M1 = rand(-9:9,3,7)
3×7 Array{Int64,2}:
0 -6 1 3 6 -7 9
-4 -8 8 -5 8 -9 9
8 2 -7 -8 0 -5 -5
julia> M2 = [M1 I]
3×10 Array{Int64,2}:
0 -6 1 3 6 -7 9 1 0 0
-4 -8 8 -5 8 -9 9 0 1 0
8 2 -7 -8 0 -5 -5 0 0 1
julia> sizeof(M1)
168
julia> sizeof(M2)
240
julia> M3 = [M1 Eye(3)]
3×10 SparseArrays.SparseMatrixCSC{Float64,Int64} with 22 stored entries:
[2, 1] = -4.0
[3, 1] = 8.0
[1, 2] = -6.0
[2, 2] = -8.0
[3, 2] = 2.0
[1, 3] = 1.0
[2, 3] = 8.0
[3, 3] = -7.0
[1, 4] = 3.0
[2, 4] = -5.0
[3, 4] = -8.0
[1, 5] = 6.0
[2, 5] = 8.0
[1, 6] = -7.0
[2, 6] = -9.0
[3, 6] = -5.0
[1, 7] = 9.0
[2, 7] = 9.0
[3, 7] = -5.0
[1, 8] = 1.0
[2, 9] = 1.0
[3, 10] = 1.0
julia> sizeof(M2), sizeof(M3)
(240, 40)
So – the FillArrays package figured out that M1
has two zeros, so 19 nonzero elements + the three diagonal elements of Eye(3)
. That is clever.