I need to iterate through all possible indices of an array for a unit test, without constructing the array, ie just from the indices. Is
- constructing a
CartesianRange
,
- then iterating through it and extracting the
I
slot
the way to do this? I am asking because it is not documented, so I am not sure if this is an interface I should rely on being reasonably stable. Example:
function simulate_index_weights(_size...)
vec(collect(c.I => rand() for c in CartesianRange(_size)))
end
simulate_index_weights(2,3,4)
Also, is there a more elegant way of discarding shape information from a generator before collecting, so that I would not have to call vec
?
Very stable and very much the way forward. A docstring PR would be most appreciated!
I wouldn’t say there’s any particular reason to pass back c.I
, just return c
. It gives you faster indexing because you don’t have to splat a tuple.
I think calling vec
is your best best. What seems inelegant about that?
Thanks for the help.
Perhaps I should rephrase: is there a way to take a generator with a shape, and convert it to a “flat” generator, without collecting?
Just curious.
1 Like
Some options are
copy!(similar(Array{eltype(C)}, length(C)), C)
copy!(Vector{eltype(C)}(length(C)), C)
Vector{eltype(C)}(length(C)) .= C
Perhaps something like this?
simulate_index_weights(_size...) = (c.I => rand() for c in CartesianRange(_size))
for x in simulate_index_weights(2,3,4)
println(x)
end