gather data from different sections of each column

1 次查看(过去 30 天)
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 个评论
Guillaume
Guillaume 2015-11-18
编辑:Guillaume 2015-11-18
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.

请先登录,再进行评论。

采纳的回答

Thorsten
Thorsten 2015-11-18
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
  3 个评论
Thorsten
Thorsten 2015-11-18
编辑:Thorsten 2015-11-18
Try
D = A(bsxfun(@plus, bsxfun(@plus, B, 0:9), (C-1)*size(A,1))');
This computes the linear indices into A based on B and C.

请先登录,再进行评论。

更多回答(2 个)

Guillaume
Guillaume 2015-11-18
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)))

Stephen23
Stephen23 2015-11-18
编辑:Stephen23 2015-11-18
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

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

产品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by