2016-08-12 93 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