【问题标题】:Matlab: extract values from vector A, based on values in vector BMatlab:根据向量 B 中的值从向量 A 中提取值
【发布时间】:2017-04-09 04:20:25
【问题描述】:
A = [5    10    16    22    28    32    36    44    49    56]
B = [2     1     1     2     1     2     1     2     2     2]

如何获得?

C1 = [10 16 28 36]
C2 = [5 22 32 44 49 56]

C1需要从A获取值,只在B1的位置 C2需要从A获取值,只在B2的位置上

【问题讨论】:

    标签: arrays matlab


    【解决方案1】:

    你可以这样做:

    C1 = A(B==1);
    C2 = A(B==2);
    

    B==1 给出一个逻辑数组:[ 0 1 1 0 1 0 1 0 0 0 ]

    A(logicalArray) 返回logicalArray 的值为true 的元素(称为逻辑索引)。 AlogicalArray 当然必须具有相同的大小。

    这可能是在matlab中做这个操作最快的方法了。

    有关索引的更多信息,请参阅matlab documentation

    【讨论】:

      【解决方案2】:

      要通过任意数量的组(而不是您的示例中的两个)来实现此目的,请使用 accumarray 和一个匿名函数将每个组中的值收集到一个单元格中。对于preserve order,需要先对B进行排序(对A也需要同样的顺序):

      [B_sort, ind_sort] = sort(B);
      C = accumarray(B_sort.', A(ind_sort).', [], @(x){x.'});
      

      这会在一个元胞数组中给出结果:

      >> C{1}
      ans =
          10    16    28    36
      >> C{2}
      ans =
           5    22    32    44    49    56
      

      【讨论】:

        猜你喜欢
        • 2014-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-06
        相关资源
        最近更新 更多