2

私は以下のように2つのセル配列を持っています:

A = {'S' 'M' 'N' 'E'};
B = {'E' 'M' 'Q' 'S'};

この場合、異なる要素の数は3です。

数値配列ではlength(find(A ~= B));、1つのステップでさまざまな要素の数を簡単に数えるために使用できます。

文字のセル配列に似たものはありますか?

4

4 に答える 4

2

セル配列が文字列のセル配列である場合は、STRCMPを使用できます。

sum(~strcmp(A,B))

もちろん、同じ長さであることを確認Aしてください。B


ちなみに、数値配列の場合は、を使用する方が効率的sum(A~=B)です。一般的findに遅いです。

于 2013-03-08T18:34:47.913 に答える
2

編集:私はあなたの質問を誤解していると思います.おそらく、配列内の対応する位置で異なる要素を見つけることを意味していました. 私はまだ私の古い答えを保持しています

同じ位置にある異なる要素を数える

yuk のアプローチstrcmpは正しいです。ただし、2 つの配列が同じサイズの場合にのみ機能します。一般化されたソリューションは次のようになります。

N = min(numel(A), numel(B));
sum(~strcmp(A(1:N), B(1:N))) + numel(A) + numel(B) - 2 * N

配列の長さが異なる場合、大きな配列の「余分な」要素は、ここでは異なるものとしてカウントされます。

任意の位置で異なる要素を数える

最も一般的なアプローチはismember、文字列の長さや配列内の位置を気にしない を使用することです。Aとの要素の合計数をカウントするには、次のBようにします。

sum(ismember(A, B)) + sum(ismember(B, A))

setdiff(の代わりにismember)を使用しても同じ効果が得られます。

numel(setdiff(A, B)) + numel(setdiff(B, A))

両方の方法は、必ずしも同じサイズであるとは限りませんが、任意の 2 つの配列に対して有効です。

于 2013-03-10T10:15:14.633 に答える
2

試す

cell2mat(A)==cell2mat(B)

まず、残りは簡単です。セル配列の次元が同じでない場合、この単純な方法は失敗します。

于 2013-03-08T14:43:30.110 に答える
0

あなたが与えた例でAとBが与えられている場合、Uはunique([AB])を試すこともできます。A と B は同じ次元ではありません。これを試すことができます。

unique(reshape(cell2mat(A,1,[])),reshape(cell2mat(B,1,[])))

于 2013-03-09T03:29:48.783 に答える