如何在MATLAB中从3D矩阵的每一行中选择矢量元素



我有一个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。冒号选择该索引级别的所有内容。

相关内容

  • 没有找到相关文章

最新更新