Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Pushing to array in Julia: failure to create inner arrays of varying dimension

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?

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

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].

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading