0

n 行 3 列の行列があります。それを呼びましょうA=[23 45 6;32 4 78;67 5 34; 54 1 4;6 9 2]

今、私はポイントのセットを持っています:B={ P1=[X1,Y1] P2=[X2,Y2] ... }= { [6 9] [32 4] }

Aすべてのセットの行(i)のインデックスを返すように、マトリックスにクエリを設定したいB

Pk(1,1) ( or Xk) == A(i,1) && Pk(1,2) ( or Yk) == A(i,2) 

つまり、列 1 && 2 に基づいてクエリを設定し、Aそれらを と比較するとB、出力は列 1 と 2 に Xk、Yk の同じ値を持つ行のインデックスになりますB

出力: 5,2

4

2 に答える 2

2

@TJ1で提案されているように、Bを行列にします

B=[6 9; 32 4];

行オプション(および2番目の出力)で交差を使用するだけです

[~, i, ~] = intersect(A(:, 1:2), B, 'rows')

最初の 2 列にインデックスを付けました。これAは、それらの列にのみ関心があり、明らかに交差して 2 つの行列に同じ数の列が必要であるためです。

結果:

i =

     5
     2
于 2013-02-05T06:19:07.297 に答える
1

B も行列形式で配置します。次に例を示します。

B=[6 9; 32 4];

これを行うために使用できる MATLAB コードを次に示します。

 k=0;
 output=[];
 for n=1:5
   for m=1:2 
     if (sum(A(n,1:2)==B(m,:)) == 2)
       k = k +1;
       output(k) = n;
     end
    end
  end

あなたの結果は にありoutputます。


編集:

行の説明を追加しています(sum(A(n,1:2)==B(m,:)) == 2)。一つ一つ見ていきましょう。A(n, 1:2)の n 番目の行の最初の 2 列である 1x2 ベクトルを返しますAB(m,:)B には 2 つの列しかないため、 も 1x2 ベクトルです。[6 9]では、 の最後の行からA[6 9]の最初の行から があるとしましょうB

[6 9] == [6 9]コマンドラインで試してください。結果は論理ベクトルです: [1 1]. その理由は、==要素ごとにベクトルを比較するためです。最初の 1 は 6 が 6 に等しいからで、2 番目は 9 が等しいからです。最初の要素が異なるため、試し[6 9] == [7 9]てみると取得できます。[0 1]

したがって、両方の要素が同じかどうかを評価するには、==演算子から得られるベクトルの合計が 2 に等しいと予想します。1 に等しい場合、1 つの要素だけが同じでした。ベクトル全体が等しいと言うには、2 である必要があります (ベクトルには 2 つの要素しかないため 2)。だからsum([6 9] == [6 9])与えます2sum([7 9] == [6 9])、与えるだけ1です。

したがって、行が等しいかどうかをテストする条件は次のとおりです。if (sum(A(n,1:2)==B(m,:)) == 2)

于 2013-02-05T06:02:51.197 に答える