セル配列を適切な次元の数値配列に変換してから、を使用して、この問題に取り組みますismember
。
次の例は、このメソッドが質問のセル配列の例でどのように機能するかを示しています。
%# Build the example cell arrays
A = {[3,0], [2,1]};
B = {[4,-1],[3,0];
[-1,4],[-3,5];
[3,0],[2,1];
[3,0],[3,0];
[2,1],[-1,4]};
%# Get the number of elements in A, and the length of the first element
K = size(A, 2);
J = length(A{1, 1});
%# Convert cell arrays to usefully shaped numerical matrices
ANumVec = cell2mat(A);
ANum = reshape(ANumVec, K, J)';
BNum = cell2mat(B);
%# Find matches of 1*2 vectors in ANum in sets of two columns of BNum
I1 = ismember(BNum(:, 1:J), ANum, 'rows');
I2 = ismember(BNum(:, J+1:end), ANum, 'rows');
I3 = ismember(BNum, ANumVec, 'rows');
%# Find all indices where there was exactly 1 match (ie omit cases of no matches and cases of 2 matches)
MainIndex = I1 + I2;
MainIndex(I3) = 0;
Soln = find(MainIndex > 0);
いくつかのポイント:
1)このメソッドは、の行に正確に対応する状況を除いB
て、の要素がA
の1番目または2番目の列にあるすべての行のインデックスを検索します。B
A
B
2)に複数の行がある場合、このメソッドは失敗しA
ます。ただし、サイズが1 * Nのセル配列であることに堅牢ですA
。ここで、Nは任意の数の1*2数値ベクトルを示します。したがって、最初A
に1 * Nセル配列に再形成することで、単一行の制限を回避できます。
3)等価性は、論理演算子を使用してテストされ==
ます。入力に浮動小数点エラーが発生しないとアプリオリに信じる理由がない限り、これは浮動小数点数では危険な場合があります。
4)この問題を解決するためのはるかに効率的な方法があるという感覚を揺るがすことはできませんが、私は現在それを見ていません。:-)