How to initialize a dictionary with empty arrays of type Array{Float64, 2}?

Hi,

can somebody tell me how to initialize a dictionary with empty arrays of type Array{Float64, 2}?

1. Alternative

dict_data = [Dict(name => Array{Float64, 2} for name in [:x1, :x2, :y1, :y2]) for i in 1:10]

dict_data[1][:x1] = zeros(10,4)

2. Alternative

dict_data = [Dict(name => Matrix{Float64} for name in [:x1, :x2, :y1, :y2]) for i in 1:10]

dict_data[1][:x1] = zeros(10,4)

But both lead to the same error message.

ERROR: MethodError: Cannot convert an object of type Array{Float64,2} to an object of type DataType

Best regards

You don’t initialise the arrays, instead you create a dict where all entries contain Array{Float64, 2}, which is a DataType.
Try this:

d = Dict(name => Matrix{Float64}(undef, 0, 0) for name in [:x1, :x2, :y1, :y2])

or, for an array of dicts of matrices, as in your example:

dict_data = [copy(d) for i in 1:10]
d[1][:x1] = zeros(10, 4)

Thanks. Can you explain me or send me a link, where (undef, 0, 0)
of the command Matrix{Float64}(undef, 0, 0) is explained?

In the REPL, see

help?> Matrix

(…)

  Matrix{T}(undef, m, n)

  Construct an uninitialized Matrix{T} of size m×n. See undef.

Also: https://docs.julialang.org/en/v1/manual/arrays/#Construction-and-Initialization-1

3 Likes

As a side note, it’s slightly more convenient to create an empty Float64 matrix with zeros(0, 0).

2 Likes

it’s also slightly slower since it has to write zeros, but this usually doesn’t matter.

There are not that many zeros to write in a 0x0 matrix, but yes, it’s slower anyway so I guess it takes a different code path.

1 Like