You don't need to convert the linear addresses to indices to assign them to the array. If you have, indeed, segregated the altitudes into subsections of vectors of 2300 (or 2301?) elements each, then to create a 2D plane for each elevation is straightforward--
[r,c,p]=ind2sub([2301 1201 24],inddata(1:2301));
You can loop through the full array in groups of 2301 for each altitude plane or compute the locations within the vector based on the number.
NB: If, indeed, the indices stored are 0-based, you'll need to add one to the inddata array above to match up to the 1-based array indexing in MATLAB. If you have control over computing those indices, it would probably make sense to make the fix up at that point unless the same data are being used in C-based code or somesuch.
To handle a subset as 3D array, just build a 3D array of 1:nPlanes wish to handle and do the same thing except pull as many segments of 2301 indices as need for the number of planes, not just one.
Note that you can subtract ElevationLevel*NumElementsPerElevation from each vector of NumElementsPerElevation indices to use as indices into the location of a given 2D plane--the elements are stored linearly by row, then column and then by plane.
That lets you generalize the linear addressing into the plane by referring them all back to as if were the r,c indices of the first plane. Doing that could eliminate the ind2sub call entirely.