【问题标题】:Find given row in a matrix在矩阵中查找给定行
【发布时间】:2011-06-02 02:51:38
【问题描述】:

我在MATLAB 中有一个 m x n 矩阵,比如 M。我有一个 n 元素行向量,即一个 x n 列矩阵,比如 X。

我知道 X 是 M 中某处的一行。如何找到 M 中的索引?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    编辑:

    gnovice 的建议比我的还要简单:

    [~,indx]=ismember(X,M,'rows')
    
    indx =
    
         3
    

    第一个解决方案:

    您可以使用findismember 轻松完成此操作。这是一个例子:

    M=magic(4);        %#your matrix
    
    M =
    
        16     2     3    13
         5    11    10     8
         9     7     6    12
         4    14    15     1
    
    X=[9 7 6 12];      %#your row vector
    
    find(ismember(M,X),1)
    
    ans =
    
         3
    

    【讨论】:

    • 您可以使用 ISMEMBER 的 'rows' 参数稍微修改您的解决方案,以消除对 FIND 的需求:[~,index] = ismember(X,M,'rows')
    • 我认为 find(ismember(M,X.'rows'),1) 中仍然需要 'rows' 关键字
    • ismember 很慢。有更快的替代方案吗?
    【解决方案2】:

    在我知道ismember之前,我曾经这样做过:

    index = find(all(bsxfun(@eq, M, X), 2));
    

    但是使用ismember(X, M, 'rows') 绝对是更可取的。

    【讨论】:

    • 这是一个很好的解决方案,因为它返回出现 X 的矩阵的所有行(与标记的答案不同)。
    • 这个解决方案比公认的要快得多(大约是大规模测试的 20 倍),它返回所有行,而不仅仅是最大的索引。
    • 有趣。我想我在添加这个答案之前检查了性能差异并且没有看到任何差异,但也许我没有使用足够大的数组。
    【解决方案3】:

    另一种为每次出现 X 返回行索引的解决方案是

    find(sum(abs(M-ones(rows(M),1)*X),2)==0)
    

    此外,此解决方案可以很容易地用于查找 X 阈值内的行,如下所示(如果数字噪声是一个问题)

    tolerance = 1e-16; %setting the desired tolerance
    find(sum(abs(M-ones(rows(M),1)*X),2)<tolerance)
    

    【讨论】:

      【解决方案4】:

      这是一个非循环版本。仅当 M (您的矩阵)不是很大时才适用,即。 n 和 m 很小。 X 是你的行:

      function ind = findRow(M,X)
          tmp = M - repmat(X,size(M,1),1); 
          ind = find(tmp,1); 
      end     
      

      如果 M 太大,迭代 M 的行并将每一行与您的向量进行比较可能会更快。

      @Edit:重命名变量以匹配问题中使用的名称。

      【讨论】:

        猜你喜欢
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        • 2021-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-20
        相关资源
        最近更新 更多