What are efficient ways to extract lower dimensional slices from a high-dimensional array ?
이전 댓글 표시
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)
댓글 수: 4
James Tursa
2011년 12월 14일
What are you doing with these slices downstream? There may be ways to process them without physically copying them to a new variable.
gg
2011년 12월 14일
James Tursa
2011년 12월 14일
Copying the data can easily dominate the run time over the calculations involved, particularly for something as simple as squaring elements or setting elements to a value. E.g., a mex routine can often significantly outperform m-code for these cases.
gg
2011년 12월 16일
채택된 답변
추가 답변 (0개)
카테고리
도움말 센터 및 File Exchange에서 Logical에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!