【发布时间】:2015-10-23 18:37:30
【问题描述】:
我有一个 3D 矩阵,例如 1000×4×20 矩阵 A,我想根据 1000×1 索引从 A 的每一行中选择一个 1×20 向量向量 B。该索引向量包括从 1 到 4 的数字。 另外,我不想使用 for 循环。 我应该怎么做(有和/或没有“sub2ind”)?
谢谢。
【问题讨论】:
标签: arrays matlab multidimensional-array indexing
我有一个 3D 矩阵,例如 1000×4×20 矩阵 A,我想根据 1000×1 索引从 A 的每一行中选择一个 1×20 向量向量 B。该索引向量包括从 1 到 4 的数字。 另外,我不想使用 for 循环。 我应该怎么做(有和/或没有“sub2ind”)?
谢谢。
【问题讨论】:
标签: arrays matlab multidimensional-array indexing
我不确定这是最优雅的方式,但它可以完成工作:
[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。 冒号选择该索引级别的所有内容。
【讨论】:
A(1:1000,B,:) 给你一个1000x1000x20 矩阵。