I have a loop like so:
edge_weights = Int[];
edge_weights_array = [edge_weights for _ in 1:199];
#make a little function for figuring out column indices
function get_columnindices(graph_base_table)::Tuple{Int,Int}
ncol(graph_base_table)
return (19,ncol(graph_base_table))
end
pairings_array = [pairings for _ in 1:grouped_by_year.ngroups];
graph_array = [SimpleWeightedGraph(get_columnindices(group)[2]-get_columnindices(group)[1]+1) for group in graph_base_table_array];
graphs = zip(graph_array,edge_weights_array,graph_base_table_array);
for graph in graphs
for i in 19:ncol(graph[3]), j in i+1:ncol(graph[3]) # iterate over all combinations of columns
w = dot(graph[3][!, i], graph[3][!, j]) # calculate how many times (i,j) occurs
if w > 0
push!(graph[2], w)
add_edge!(graph[1], i, j, w)
end
end
end
I noticed that the array of arrays in the second position push!(graph[2], w)
gets enlarged a lot more than I want. It should be an array of arrays where the inner array size varies. Somehow, they all end up the same size. From the zip
, does graph[2]
not access the inner array and moves on to the next inner array? Somehow, the code ends up enlarging the inner arrays all to the same size.
How can I create inner arrays in edge_weights_array
that vary in size? Am I using push
wrong?
The issue is that edge_weights_array = [edge_weights for _ in 1:199]
creates an array where every element is the same underlying array — it doesn't make 199 copies of edge_weights
.
julia> edge_weights = Int[];
julia> edge_weights_array = [edge_weights for _ in 1:199];
julia> push!(edge_weights, 1)
1-element Vector{Int64}:
1
julia> edge_weights_array
199-element Vector{Vector{Int64}}:
[1]
[1]
[1]
⋮
[1]
[1]
[1]
You need to create separate ones, with edge_weights_array = [Int[] for _ in 1:199]
.