2

私はMatlabで次のことをやろうとしています。繰り返し要素を含む可能性のある 2 つの数値リストを取得し、一方のセットを他方のセットから減算します。

例: A=[1 1 2 4]; B=[1 2 4];

望ましい結果は AB=C=[1] です

または、別の例として、E=[3 3 5 5]; F=[3 3 5];

望ましい結果は EF=G=[5] です

Matlab の集合操作を使用してこれを行うことができればよいのですが、それらの関数 setdiff は行列内の繰り返される要素を尊重しません。これは厳密な集合論の観点からは正しいと思いますが、「私は 3 つのリンゴと 4 つのオレンジを持っています。あなたは 2 つのリンゴと 1 つのオレンジを持っています。それぞれ何個残っていますか?」というような問題に取り組みたいと思います。これらのセットで可能な値の範囲は数千に及ぶため、要素を集計してから行列を減算するために大きな行列を構築することは、速度の理由から実行可能ではないようです。GUI メニュー操作中に、何千ものセット要素を使用してこれらの計算を何千回も行う必要があります。

上記の 2 番目の例に取り組むために避けたいことの例: E=[0 0 2 0 2]; F=[0 0 2 0 1];

G=EF=[0 0 0 0 1];

ご協力いただきありがとうございます!

4

2 に答える 2

2

これは accumarray コマンドで実行できます。

A = [1 1 2 4]';
B = [1 2 4]';  % <-make these column vectors

X = accumarray(A, 1);
Y = accumarray(B, 1); 

これにより、出力が生成されます

X = [2 1 0 1]'

Y = [1 1 0 1]'

ここで、X(i) はベクトル A の番号 i のインシデントの数を表し、Y(i) はベクトル B の番号 i のインシデントの数を表します。

次に、X - Y を取ることができます。

1 つの注意点: A と B の最大値が異なる場合、accummarray からの出力の長さは異なります。その場合は、出力をより大きなベクトルのサイズであるゼロのベクトルのサブセットに割り当てることができます。

于 2012-02-23T06:17:47.163 に答える
1

Prototoastの答えを改善したいだけです。

AまたはBに正でない数を含む落とし穴を避けるために、次のように使用しますhist

A = [-10 0 1 1 2 4];
B = [1 2 4];

ABの和集合の最小値と最大値が必要です。

U = [A,B];
range_ = min(U):max(U);

hist同じ長さのベクトルを得るために使用できるように:

a = hist(A,range_)
b = hist(B,range_)

次に、ヒストグラムを減算する必要があります。

r = a-b

差集合演算子を対称にしたい場合は、次を使用します。

r = abs(a-b)

以下は、どのアイテムがA \ Bにあるかを示します(\ ここに、変更されたセットの違いがあります)。

C = range_(logical(r))

お役に立てれば。

于 2012-02-23T16:24:37.950 に答える