【问题标题】:Finding where a set of values lie within a matrix查找一组值在矩阵中的位置
【发布时间】:2016-08-12 10:20:18
【问题描述】:

我有两个值(k 和 j),我知道它们在 nx3 矩阵 (M) 内。我知道它们在同一行并且 j 总是在 k 的右侧,所以如果 k 在 M(2,1) 中,那么 j 将在 M(2,2) 中。我在函数的前面对此进行了测试,但现在我想知道哪一行是给定的 k 和 j。我需要他们所在位置的行号才能继续。矩阵中没有重复的 k 和 j 组合。

所以如果我有矩阵

M=

1 4 5
1 5 7
k j 5
4 5 6
2 3 1

然后我想知道它们在第 3 行。没有一列是有序的。

我的尝试

我使用了下面的代码

[row,~] = find(M==k);

我不确定如何寻找它们的组合。我想避免使用 find 功能。我希望可能使用逻辑索引。

我该怎么做呢?我希望这个问题有意义。

【问题讨论】:

  • 你写道,“j 总是在 k 的右边”。但是你的矩阵M否定了这个说法!
  • @Sardar_Usama 感谢您的观察 - 已更正
  • “我不知道如何寻找它们的组合。”但是如果你知道“j 总是在 k 的右边”,那么你就不需要找到这个组合。或者您的意思是 if jk 在同一行,您知道它会(立即?)在 j 的右侧?您的规格仍不清楚。

标签: matlab matrix find


【解决方案1】:

你可以使用bsxfun -

find(all(bsxfun(@eq,A(:,1:2),[k,j]),2) | all(bsxfun(@eq,A(:,2:3),[k,j]),2))

作为与bsxfun的关系操作,根据这个post on benchmarked results,这应该是相当高效的。

样本运行

案例#1:

A =
     1     4     5
     1     5     7
     6     7     1
     4     5     6
     2     3     1
k =
     6
j =
     7
>> find(all(bsxfun(@eq,A(:,1:2),[k,j]),2) | all(bsxfun(@eq,A(:,2:3),[k,j]),2))
ans =
     3

案例#2:

A =
     1     4     5
     1     5     7
     1     6     7
     4     5     6
     2     3     1
k =
     6
j =
     7
>> find(all(bsxfun(@eq,A(:,1:2),[k,j]),2) | all(bsxfun(@eq,A(:,2:3),[k,j]),2))
ans =
     3

【讨论】:

    【解决方案2】:

    bsxfun 的版本略有不同。这不将矩阵限制为三列。

    find(sum(((bsxfun(@eq,M,j) + bsxfun(@eq,M,k)) .* M).' ) == j+k >0)
    

    案例一:

    M = [
         1     4     5
         1     5     7
         6     7     1
         4     5     6
         2     3     1]
    k=6;j=7; 
    
    ans =  3
    

    案例 2:

    M=[
         1     4     5
         1     5     7
         1     6     7
         4     5     6
         2     3     1
         ];
    k=6;j=7;
    
    ans =  3
    

    【讨论】:

      【解决方案3】:

      使用这个:

      row = find(((M(:,1) == k ) & ( M(:,2) == j)) | ((M(:,1) == k ) & ( M(:,3) == j)) | ((M(:,2) == k ) & ( M(:,3) == j)) )
      

      另外,逻辑索引只能给你一个矩阵,zeros 在所有其他位置,one 在你需要的位置。但要获得该位置的索引,您必须使用find

      【讨论】:

      • 但这假设j 在第一列,k 在第二列。我认为这个问题更普遍,所以j 可以在除最后一列之外的任何列中(否则k 将没有空间)。在这种情况下,由于矩阵有 3 列,j 可能在第二列,k 在最后一列
      • @SembeiNorimaki 感谢您指出这一点。已修复,但不确定是否最佳。
      • 只删除第1列中j和第3列中k的部分,因为我认为这不是一个有效的答案,其他两种情况都可以。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多