3

要素ごとに等しいかどうかをチェックし、等しい要素の総数を返す必要がある 2 つのベクトルがあります。したがって、a = {1,0,1} と b = {1,0,0} を比較すると、2 が返されます。

以下の例は、私が再帰関数に対して行った努力ですが、エラーを返しています。

Elementcompare[list1_, list2_] :=   If[First[list1] == First[list2], 1, 0]  + Elementcompare[Rest[list1], Rest[list2]];

ありがとう

4

3 に答える 3

3

ベクトルの長さは一般的に同じだと思います。これには関数があります-HammingDistanceを使用して定義できます:

elcom[a_List, b_List] := Length[a] - HammingDistance[a, b]

テストしてみる

elcom[a, b]

2

EditDistanceもチェックしてください。

于 2012-12-14T16:36:49.087 に答える
2

ベクトルがビットベクトル (0 と 1) の場合、ビット演算子を使用して、この計算の速度を向上させることができます。

a = RandomInteger[1, 500000];

b = RandomInteger[1, 500000];

まず、一貫性を確認します。

HammingDistance[a, b]

249965

Tr@Unitize[a - b]

249965

Total@BitXor[a, b]

249965

速度を確認します。

Do[HammingDistance[a, b], {50}] // Timing // First

1.98993

Do[Tr@Unitize[a - b], {50}] // Timing // First

0.437551

Do[Total@BitXor[a, b], {50}] // Timing // First

0.139816

于 2012-12-30T05:29:06.810 に答える
2

簡単で迅速な方法は、ベクトル レベルの数値演算を使用することです。

a = {0, 1, 0, 1, 2};

b = {2, 1, 3, 1, 2};

a - b
{-2, 0, -3, 0, 0}
Unitize[a - b]
{1, 0, 1, 0, 0}
Tr @ Unitize[a - b]
2

HammingDistanceこれは、次の使用法と同等です。

HammingDistance[a, b]
2

Trパックされた配列では非常に高速であるため、私は合計を使用します。HammingDistance2 つの長いリストを使用したバージョン 7 との速度比較:

a = RandomInteger[3, 500000];
b = RandomInteger[3, 500000];

Do[HammingDistance[a, b], {50}] // Timing // First

Do[Tr @ Unitize[a - b], {50}]   // Timing // First

0.968

0.171

aとがパックされた配列でない場合、パフォーマンスはより似bていますが、それでも数値メソッドが優先されます。Length[a]Vitaliy が示したように、戻り値を差し引いてターゲット メトリックを取得できます。

于 2012-12-15T21:36:04.240 に答える