2016-08-12 1 views
4

私は、nx3行列(M)内に2つの値(kとj)があることを知っています。私は彼らが同じ行にいることを知り、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

、* * "jはkの右側に常にあります"。しかし、あなたの行列 'M'はこのステートメントを否定します! –

+0

@Sardar_Usama観察していただきありがとうございます - –

+0

を修正しました。「私はそれらの組み合わせを探す方法がわかりません。"しかし、もしあなたが**" 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))) 

また、論理的なインデックスは、あなたの必要な位置に他のすべての位置でzerosoneであなたの行列を与えることができます。しかし、そのポジションのインデックスを取得するには、findを使用する必要があります。あなたがbsxfun使用することができます

+1

でも、これは 'j'が第1列に、' k'が第2列にあると仮定しています。問題がより一般的なので、 'j'は最後のものを除くどの列にもあり得ます(そうでなければ' k 'のための余地はありません)。この場合、行列は3列を持つので、 'j'は2番目最後の1つで 'k 'と書かれています –

+0

@SembeiNorimakiそれを指摘していただきありがとうございます。最適だとはっきりしていません。 – Nishant

+0

私は思うので、jが1列目、有効な答えではない、他の2つのケースは大丈夫です。 –

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によると、これはかなり効率的でなければなりません。

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上の少し異なるバージョン

サンプル

ケース#1を実行します。これは、行列を3つの列に限定しません。

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 
関連する問題