In my code I have some 3D matrices M[m,i,j] where I iterate much less frequent over the first index (m: timestep) than over the other two (i,j: spatial discretization). I would like to have an alias for M[m, :, :] so I can operate on a 2D matrix within the timestep loop to make the code more compact and easy to read, especially when passing the 2D matrix to multiple other functions.

In the first block, when I change X, M changes too. I would like to achieve the same behavior in the second block where M is not changed (and I assume its values are copied to X because I observed increased runtime).

M = zeros(3,3,3)
X = M
X[1,1,1] += 1
@show M
M = zeros(3,3,3)
X = M[1,:,:]
X[1,1] += 1
@show M

Is there a way to create such a reference or is my need for it an indicator that my design is fundamentally flawed?
Thank you very much in advance!

As a column-major object, the â€śfastestâ€ť indices in an Array are the first ones. This matches MATLAB but is opposite to NumPy. This is to say that you might get faster performance storing M as M[i,j,m] rather than your current M[m,i,j], since it appears that your â€śtight loopâ€ť actions are over i,j rather than m.

Further (and unlike MATLAB, NumPy, and some other tools), Julia handles arrays-of-arrays quite nicely and with decent performance. If youâ€™re commonly slicing M[:,i,j]and alsoM[m,:,:] then you might truly be better off with your current 3D array approach. On the other hand, if most of your slicing is only one of those, then arrays-of-arrays are probably cleaner to work with. From your description, you would probably organize things to index as M[m][i,j] if you went this direction.