# Vector of matrices vs. multidimensional arrays

Sorry to dig up an old thread, but since this was referenced in another post I figured it was worth correcting the record.

The entire difference you’re observing between the vector-of-matrix approach and the 3D array approach here is due to your vector having a non-concrete element type. Your `vec_mat` is of type `Array{Matrix}`, but `Matrix` is not a concrete type. You need `Array{Matrix{Float64}}`. Likewise for your vector-of-vectors-of-vectors approach, you need an `Array{Vector{Vector{Float64}}}` not `Array{Vector{Vector}}`.

Switching to concretely typed structures makes the 3D array and vector-of-matrix approaches perform almost exactly the same:

``````julia> function f(x::Array{T, 3}) where T
x .+= 1
end
f (generic function with 2 methods)

julia> function f(x::Array{Matrix{T}}) where T
for matrix in x
matrix .+= 1
end
end
f (generic function with 2 methods)

julia> x_array = zeros(N, N, N);

julia> x_vec_mat = [zeros(N, N) for i in 1:N];

julia> using BenchmarkTools

julia> @btime f(\$x_array);
609.838 μs (0 allocations: 0 bytes)

julia> @btime f(\$x_vec_mat);
505.012 μs (0 allocations: 0 bytes)
``````
4 Likes