3

我有两个向量,我需要检查元素是否相等并返回相等的元素总数。因此比较 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

一种简单快捷的方法是使用向量级数值运算。

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

我使用Trsum 因为它在打包数组上非常快。与版本 7 的速度比较,HammingDistance有两个长列表:

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 回答
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 回答