我有两个向量,我需要检查元素是否相等并返回相等的元素总数。因此比较 a = {1,0,1} 和 b = {1,0,0} 将返回 2。
下面的示例是我对递归函数所做的努力,但正在返回错误。
Elementcompare[list1_, list2_] := If[First[list1] == First[list2], 1, 0] + Elementcompare[Rest[list1], Rest[list2]];
谢谢
我有两个向量,我需要检查元素是否相等并返回相等的元素总数。因此比较 a = {1,0,1} 和 b = {1,0,0} 将返回 2。
下面的示例是我对递归函数所做的努力,但正在返回错误。
Elementcompare[list1_, list2_] := If[First[list1] == First[list2], 1, 0] + Elementcompare[Rest[list1], Rest[list2]];
谢谢
我假设向量的长度通常是相同的。有一个功能 - HammingDistance您可以使用它来定义:
elcom[a_List, b_List] := Length[a] - HammingDistance[a, b]
测试一下
elcom[a, b]
2
另请查看EditDistance。
一种简单快捷的方法是使用向量级数值运算。
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
sum 因为它在打包数组上非常快。与版本 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 所示,您可以从中减去返回值以获得目标指标。
如果您的向量是位向量(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