This is really interesting! There are peaks at very regular intervals, and the curve is more or less flat in between. After each peak the line rises a bit. Neat! I think this is related to cache lines. You are measuring the cost of copying the array, which is presumably related to the cost of reading and writing cache lines.
If you replace the line
building_array = [building_array 1];
building_array(end+1) = 1;
then you won’t be copying the data at every iteration loop, but actually appending an element to the array. With this change I get a mostly flat line, with peaks at logarithmically increasing distances (and of logarithmically increasing height too), which is consistent with the common-sense implementation of doubling array size when needed:
Just some more explanation:
building_array = [building_array 1] creates a new array, one element larger than
building_array, and copies
1 into it. This is then assigned to
building_array. It seems that MATLAB’s JIT has not yet been optimized for this code pattern!