如何检查两个向量的元素相等性?

时间:2012-12-14 16:32:30

标签: wolfram-mathematica

我有两个向量,我需要检查元素明智的相等性,并返回相等的元素总数。因此,比较a = {1,0,1}和b = {1,0,0}将返回2.

以下示例是我对递归函数所做的努力,但是返回错误。

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

由于

3 个答案:

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

ab不是打包数组但数值方法仍然获胜时,性能更相似。您可以从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