我有一个3D矩阵,例如一个1000 × 4 × 20的矩阵a,我想根据1000 × 1的索引向量b从a的每一行中选择一个1 × 20的向量。这个索引向量包括从1到4的数字。另外,我不想使用for循环。我应该怎么做(有和/或没有"sub2ind")?
谢谢。
我不确定这是最优雅的方式,但它完成了工作:
[r,c,~]=size(A);
Q=reshape(A,r*c,[]);
P=sub2ind([r,c],[1:r]',B);
result=Q(P,:);
这将把每个1x1x20向量放入1000x20结果矩阵中的适当行中。如果需要,可以将最后两行合并。
这里是一个样本运行的前20行,向量B
附加到前面,以显示我们应该取哪一列。A
的结构应该是非常明显的(第一个数字是列号,接下来的3个是行号- 1。1x1x20向量的所有元素都相同)
B result
2 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000
1 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001
4 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002 4002
4 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003 4003
3 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004 3004
4 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005 4005
3 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006 3006
1 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007 1007
3 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008 3008
4 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009 4009
2 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010
4 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011 4011
3 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012 3012
2 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013
4 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014 4014
4 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015 4015
1 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016 1016
2 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
4 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018 4018
3 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019 3019
这是使用bsxfun
的另一种方法:
[r, c, t] = size(A);
result = A(bsxfun(@plus, (1:r).'+r*(B-1), (0:t-1)*r*c));
假设向量称为A
。你可以像这样索引它:
A(1:1000,B,:)
其中index1的取值范围是1 ~ 1000,index2的取值范围是1 ~ 4。冒号选择该索引级别的所有内容。