Multidimensional Indices of Multiple pages
3 次查看(过去 30 天)
显示 更早的评论
Hi, I have a matrix of dimensions 5 by 7 by 50 e.g. g1 = rand(5,7,50) I have another matrix of indices for the row and column e.g. [1 3; 4 5; etc] Now I would like to index all the pages at those indices:
My attempt albeit slow:
for page = 2:50
lg = sub2ind(size(g1), ind(:,1), ind(:,2), page.*ones(length(ind),1),1))
g1(lg)
end
Could someone explain to me how to do the above without for loop. I think I can follow one of the link below to remove the sub2ind. Thx!
In addition to the following I did look at the doc
1 个评论
采纳的回答
Andrei Bobrov
2012-4-30
id12 = [1 3; 4 5];
out = g1(bsxfun(@plus,bsxfun(@minus,id12,[0 1])*[1;size(g1,1)],(0:size(g1,3)-1)*prod(size(g1(:,:,1)))));
3 个评论
Geoff
2012-5-1
I really need to get my head around this bsxfun. Andrei, you seem to use it for at least 50% of your answers. It's obviously a powerful tool.
Sean de Wolski
2012-5-1
@Geoff, consider these, figure out how they're working:
A = bsxfun(@times,ones(2,3),reshape(1:5,1,1,5))
B = bsxfun(@plus,1:5,(1:4).')
Then answer this one:
http://www.mathworks.com/matlabcentral/cody/problems/4-make-a-checkerboard-matrix
with bsxfun
更多回答(2 个)
Geoff
2012-4-30
You could use linear indexing if you convert each row/column into a page start index, then take the page range....
g1 = rand(5,7,50);
xy = [1 3; 4 5; 2 1];
% Get the first page index for each xy pair.
start = xy(:,1) + (xy(:,2)-1) * size(g1,1);
% Generate linear index across all pages.
makerange = @(x) x:size(g1,1)*size(g1,2):numel(g1);
indices = cell2mat( arrayfun( @makerange, start, 'UniformOutput', false ) );
% Pull out the pages. One page per row, corresponding to the rows in xy.
pages = g1(indices);
I'm a MatLab newbie, so there might be clever functions I don't know about that do some of this work for you. That effectively does what you are asking though. =)
3 个评论
Sean de Wolski
2012-5-1
@Geoff, common misperception. Since the advent of the JIT compiler for-loops are often faster than vectorized methods.
Sean de Wolski
2012-4-30
perhaps I'm not clear but if:
A = bsxfun(@times,ones(5,7),reshape(1:50,1,1,50)) %each slice is its index
and you want to extract all slices at rows 3,4 and cols, 4,5, just use the colon operator on the 3rd dimension
A([3 4],[4 5],:)
And you are correct, sub2ind will likely be slower than a well written for-loop.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrix Indexing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!