gather data from different sections of each column
    2 views (last 30 days)
  
       Show older comments
    
Consider the code:
 totmods    = 10000;
 numselect = 1000;
 A = rand(100,totmods);        % numbers
 B = randi(90,10,1000);        % start row index
 C = randi(totmods,numselect,1); % column index
 D = A(B:B+9,C);
The resulting matrix D should be the 10x1000 matrix wherein each column is a selection of 10x1 data starting from the index B for each column in A. However, the code does not work correctly. The code uses only B(:,1) as the row index for all the elements gathered from A in the line "D = A(B:B+9,C);"
How can this be corrected without using a loop?
1 Comment
  Guillaume
      
      
 on 18 Nov 2015
				
      Edited: Guillaume
      
      
 on 18 Nov 2015
  
			The code uses only B(:,1) is slightly incorrect. The code actually only uses B(1, 1) because that's the documented behaviour of the colon operator:
   If you specify nonscalar arrays, MATLAB interprets j:i:k as j(1):i(1):k(1)
I have no idea which values of B (considering it is 10x1000 matrix) you're trying to use for each row of your D output.
Accepted Answer
  Thorsten
      
      
 on 18 Nov 2015
        You only need numelselect values of rows:
 B = randi(90,numselect,1);
Then use
 for i = 1:numel(B), D(:,i) = A(B(i):B(i)+9, C(i)); end
More Answers (2)
  Guillaume
      
      
 on 18 Nov 2015
        totmods = 10000;
numselect = 1000;
A = reshape(1:100*totmods, 100, totmods);      
B = randi(size(A, 1) - 9, numselect, 1); %column vector
C = randi(totmods, 1, numselect);  %row vector to make it easier later
rowmatrix = bsxfun(@plus, B, 0:9)'; %matrix of row indices
D = A(sub2ind(size(A), rowmatrix, repmat(C, 10, 1)))
0 Comments
  Stephen23
      
      
 on 18 Nov 2015
        
      Edited: Stephen23
      
      
 on 18 Nov 2015
  
      Preallocate the output before allocating to it:
As numselect gets larger this will have a very significant effect on the calculation speed. Try something this:
B = randi(90,numselect,1);
D = nan(10,numel(B));
for k = 1:numel(B)
    D(:,k) = A(B(k):B(k)+9, C(k));
end
0 Comments
See Also
Categories
				Find more on Matrix Indexing in Help Center and File Exchange
			
	Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!