0

セルがあるとします

A = {[3,0], [2,1]}

セル配列

B = {[4,-1],[3,0];      
      [-1,4],[-3,5];
      [3,0],[2,1];
      [2,1],[-1,4]}.

の両方のエントリが表示される行を除外して、最初または 2 番目のエントリの両方がA表示されるインデックスを見つけたいと思います。BBA

この例では[1 4]、 の行のようなものを取得する必要がありますB。私は and を使用してこれを理解しようとしてきましたcellfuncell2mat、つまずき続けています。

4

2 に答える 2

0

セル配列を適切な次元の数値配列に変換してから、を使用して、この問題に取り組みます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番目の列にあるすべての行のインデックスを検索します。BAB

2)に複数の行がある場合、このメソッドは失敗しAます。ただし、サイズが1 * Nのセル配列であることに堅牢ですA。ここで、Nは任意の数の1*2数値ベクトルを示します。したがって、最初Aに1 * Nセル配列に再形成することで、単一行の制限を回避できます。

3)等価性は、論理演算子を使用してテストされ==ます。入力に浮動小数点エラーが発生しないとアプリオリに信じる理由がない限り、これは浮動小数点数では危険な場合があります。

4)この問題を解決するためのはるかに効率的な方法があるという感覚を揺るがすことはできませんが、私は現在それを見ていません。:-)

于 2013-01-21T04:04:13.103 に答える
0

迅速かつ汚い:

C=zeros(size(B));

for i=1:size(C,1);
    for j=1:size(C,2);
        for k=1:length(A);
            C(i,j)=C(i,j)+isequal(B{i,j},A{k}); % Does element k of A match?
        end;
    end;
end;

find(sum(C')==1) % Sums the rows and finds the rows with only one match
于 2013-01-21T03:36:52.727 に答える