我有两个向量,我需要检查元素明智的相等性,并返回相等的元素总数。因此,比较a = {1,0,1}和b = {1,0,0}将返回2.
以下示例是我对递归函数所做的努力,但是返回错误。
Elementcompare[list1_, list2_] := If[First[list1] == First[list2], 1, 0] + Elementcompare[Rest[list1], Rest[list2]];
由于
答案 0 :(得分:3)
我假设向量的长度一般是相同的。有一个函数 - HammingDistance你可以用它来定义:
elcom[a_List, b_List] := Length[a] - HammingDistance[a, b]
测试出来
elcom[a, b]
2
另请查看EditDistance。
答案 1 :(得分: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
求和,因为它在打包数组上非常快。使用两个长列表与版本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所示。
答案 2 :(得分: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