【问题标题】:Finding index of vector from its original matrix从原始矩阵中找到向量的索引
【发布时间】:2013-05-23 23:28:43
【问题描述】:

我有一个二维矩阵,让我们假设矩阵的值

a =
    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    17    24     1     8    15
    11    18    25     2     9

这个矩阵将被随机分成三个不同的矩阵

b =
     17    24     1     8    15
     23     5     7    14    16

c =
      4     6    13    20    22
     11    18    25     2     9

d =
     10    12    19    21     3
     17    24     1     8    15

我如何知道矩阵 d 中向量的索引,例如在原始矩阵 a 中,注意矩阵的值可以重复。 例如,如果我想知道矩阵 a 中 {10 12 19 21 3} 的索引? 或者矩阵a中{17 24 1 8 15}的索引,但是对于这个应该只返回索引值? 如果您能帮我解决这个问题,我将不胜感激。提前谢谢你

【问题讨论】:

    标签: matlab matrix-indexing


    【解决方案1】:

    您可以将ismember'rows' 选项一起使用。例如:

    tf = ismember(a, c, 'rows')
    

    应该产生:

    tf =
         0
         0
         1
         0
         0
         1
    

    要获取行的索引,您可以将find 应用于ismember 的结果(请注意,如果您打算将此向量用于矩阵索引,则它是多余的)。这里find(tf)返回向量[3; 6]

    如果您想知道矩阵a 中匹配单个向量的行数,您可以使用解释的方法并应用find,或者使用ismember 的第二个输出参数。例如:

    [tf, loc] = ismember(a, [10 12 19 21 3], 'rows')
    

    为您的示例返回 loc = 4。注意这里a是第二个参数,所以输出变量loc会保存一个有意义的结果。

    处理浮点数

    如果您的数据包含浮点数,ismember 方法将失败,因为浮点比较不准确。这是Amro 解决方案的一个较短的变体:

    x = reshape(c', size(c, 2), 1, []);
    tf = any(all(abs(bsxfun(@minus, a', x)) < eps), 3)';
    

    本质上这是一个单行命令,但为了清楚起见,我将其拆分为两个命令:

    • x 是要搜索的目标行,沿第三维连接。
    • bsxfuna 的所有行中依次减去每一行,并将结果的大小与某个小的阈值(例如 eps)进行比较。如果一行中的所有元素都低于它,则将此行标记为“1”。

    【讨论】:

      【解决方案2】:

      这取决于您如何构建这些分割矩阵。例如:

      a = magic(5);
      d = a([2 1 2 3],:);
      

      那么匹配的行显然是:2 1 2 3


      编辑:

      让我扩展一下使用@EitanT 所示的ismember 处理浮点比较的想法:

      tf = any(cell2mat(arrayfun(@(i) all(abs(bsxfun(@minus, a, d(i,:)))<1e-9,2), ...
          1:size(d,1), 'UniformOutput',false)), 2)
      

      不漂亮但有效 :) 这对于比较是必要的,例如:0.1*3 == 0.3

      (基本上它将d 的每一行与a 的所有行使用绝对差进行比较)

      【讨论】:

      • +1:同样,处理浮点数的好主意。我为此添加了自己的变体:)
      猜你喜欢
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      相关资源
      最近更新 更多