找到一组值位于矩阵内的位置

时间:2016-08-12 10:20:18

标签: matlab matrix find

我有两个值(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函数。我希望可能使用逻辑索引。

我该怎么做呢?我希望这个问题有道理。

3 个答案:

答案 0 :(得分:1)

使用此:

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

此外,逻辑索引只能为您提供所有其他位置zeros和所需位置one的矩阵。但要获得该位置的索引,您必须使用find

答案 1 :(得分:1)

您可以使用bsxfun -

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

根据此post on benchmarked results,使用bsxfun作为关系操作,这应该非常有效。

示例运行

案例#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 :(得分:1)

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

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

案例1:

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