我有两个值(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函数。我希望可能使用逻辑索引。
我该怎么做呢?我希望这个问题有道理。
答案 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