私は以下のように2つのセル配列を持っています:
A = {'S' 'M' 'N' 'E'};
B = {'E' 'M' 'Q' 'S'};
この場合、異なる要素の数は3です。
数値配列ではlength(find(A ~= B));
、1つのステップでさまざまな要素の数を簡単に数えるために使用できます。
文字のセル配列に似たものはありますか?
私は以下のように2つのセル配列を持っています:
A = {'S' 'M' 'N' 'E'};
B = {'E' 'M' 'Q' 'S'};
この場合、異なる要素の数は3です。
数値配列ではlength(find(A ~= B));
、1つのステップでさまざまな要素の数を簡単に数えるために使用できます。
文字のセル配列に似たものはありますか?
セル配列が文字列のセル配列である場合は、STRCMPを使用できます。
sum(~strcmp(A,B))
もちろん、同じ長さであることを確認A
してください。B
ちなみに、数値配列の場合は、を使用する方が効率的sum(A~=B)
です。一般的find
に遅いです。
編集:私はあなたの質問を誤解していると思います.おそらく、配列内の対応する位置で異なる要素を見つけることを意味していました. 私はまだ私の古い答えを保持しています
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 つの配列に対して有効です。
試す
cell2mat(A)==cell2mat(B)
まず、残りは簡単です。セル配列の次元が同じでない場合、この単純な方法は失敗します。
あなたが与えた例でAとBが与えられている場合、Uはunique([AB])を試すこともできます。A と B は同じ次元ではありません。これを試すことができます。
unique(reshape(cell2mat(A,1,[])),reshape(cell2mat(B,1,[])))