I am looking for an efficient way to extract sub-arrays from a larger array. There are (at least) two standard solutions both having certain disadvantages.
First solution: Use a loop Disadvantage: Might be slow if nidx (see code below) is large
Second solution: use sub2ind Disadvantage: Interim indices created are large if nidx * ndim3 is large
Any other (especially better) ideas?
Kind regards, gg
%create 3dim testarray
ndim1 = 3; ndim2 = 4; ndim3 = 5; testarr = rand([ndim1,ndim2,ndim3]); %pick some indices into the first two dimensions
nidx = 10; idx1 = randi([1,ndim1],[nidx,1]); idx2 = randi([1,ndim2],[nidx,1]); %now extract slices from testarr according to the indices
%First solution: by loop
newarr = zeros(nidx, ndim3); for kidx = 1:nidx newarr(kidx,:) = testarr(idx1(kidx), idx2(kidx), :); end %Second solution using sub2ind
refidx1 = repmat(idx1, [ndim3,1]); refidx2 = repmat(idx2, [ndim3,1]); tmp = repmat((1:ndim3),[nidx, 1]); refidx3 = tmp(:); lidx = sub2ind(size(testarr), refidx1, refidx2, refidx3); newarr_alt = reshape(testarr(lidx), nidx, ndim3); %are they equal this time?
isequal(newarr, newarr_alt)
Best Answer