What are efficient ways to extract lower dimensional slices from a high-dimensional array ?
    3 vues (au cours des 30 derniers jours)
  
       Afficher commentaires plus anciens
    
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 commentaires
  James Tursa
      
      
 le 14 Déc 2011
				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.
Réponse acceptée
  Andrei Bobrov
      
      
 le 14 Déc 2011
        s = size(testarr);
m = prod(s(1:2));
out = testarr(bsxfun(@plus,idx2*(s(1)-1)+idx1,0:m:(s(3)-1)*m))
Plus de réponses (0)
Voir également
Catégories
				En savoir plus sur Matrix Indexing dans Help Center et File Exchange
			
	Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!