2016-08-12 95 views
4

我有两个值(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); 

的代码我不知道如何寻找它们的组合。我想避免使用查找功能。我希望可能使用逻辑索引。

我该如何去做这件事?我希望这个问题有道理。

+0

你写,* “j是始终k的权利” *。但是你的矩阵'M'否定了这个说法! –

+0

@Sardar_Usama谢谢你的观察 - 更正 –

+0

“我不知道如何寻找他们的组合。“但是如果你知道**”j永远在k的右边“,那么你不需要找到这个组合,或者你的意思是* if *'j'与' k',你知道它会立即('?')到'j'的右边吗?你的规范还不清楚 – beaker

回答

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

但是这个假设'j'在第一列,'k'在第二个。问题更为普遍,所以'j'可以在除最后一列之外的任何列中(否则就没有'k'的空间)。在这种情况下,由于矩阵有3列,所以'j'可能在第二个一个和'k'在最后一个 –

+0

@SembeiNorimaki谢谢你指出它,修正它,不知道它是否是最优的,但是, – Nishant

+0

只删除第1列中的j和第3列中的k的部分,因为我认为不是一个有效的答案,其他两种情况都可以。 –

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 
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