如何比较两个数组的所有元素?

ano*_*non 16 comparison matlab matrix vectorization

我有两个大数组,大约1000行和1000列.我需要比较这些数组的每个元素,如果相应的元素相等,则将1存储在另一个数组中.

我可以使用for循环但这需要很长时间.我怎么能更快地做到这一点?

Amr*_*mro 29

给出的答案都是正确的.我只是想详细说明gnovice关于浮点测试评论.

比较浮点数是否相等时,必须使用容差值.通常使用两种类型的公差比较:绝对公差和相对公差.(来源)

绝对容差比较ab看起来像:

|a-b| < tol
Run Code Online (Sandbox Code Playgroud)

相对容差比较如下:

|a-b| < tol*max(|a|,|b|) + tol_floor
Run Code Online (Sandbox Code Playgroud)

您可以将以上两个实现为匿名函数:

%# absolute tolerance equality
isequalAbs = @(x,y,tol) ( abs(x-y) <= tol );

%# relative tolerance equality
isequalRel = @(x,y,tol) ( abs(x-y) <= ( tol*max(abs(x),abs(y)) + eps) );
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它们:

%# let x and y be scalars/vectors/matrices of same size
x == y
isequalAbs(x, y, 1e-6)
isequalRel(x, y, 1e-6)
Run Code Online (Sandbox Code Playgroud)

  • 尝试:`isequal(0.3,0.1*3)`,相当于`0.3 == 0.1*3`.两者的答案都是假的! (4认同)
  • 关于使用EPS的一点是:它也是*相对*功能.不带参数调用EPS可以得到从1.0到下一个最大双精度数的距离.对于你的第二个匿名函数,你可能想要使用像`tol*eps(max(abs(x),abs(y)))`这样的东西,它可以给你在`的值范围内的浮点精度. x`和`y`(乘以`tol`). (2认同)
  • @gnovice:其实那不正确.如果你按照我引用的链接(MATLAB xUnit框架的文档的一部分),它解释了当`a`和`b`非常接近0时,`tol_floor`值作为绝对容差.我只是选择使用`eps`.事实上,你可以省略它,并将其定义为:`abs(xy)<= tol*max(abs(x),abs(y))`用户选择`tol`的值(一个好的默认值是'1e-8`) (2认同)

gno*_*ice 12

如果你的两个矩阵AB大小都一样,那么你可以这样做:

index = A == B;
Run Code Online (Sandbox Code Playgroud)

并且index将是一个逻辑数组,其中包含的元素是A和,B并且相等,否则为零.

一句警告......

如果AB包含整数,则上述情况应该没问题.但是,如果它们包含浮点值,则可能会得到不希望的结果.对于完全相同的元素,上面的代码只有一个值.即使是最小的差异也会导致元素被认为是不相等的.

您可以查看此问题的答案,以获取有关处理"浮点运算的危险"的更多信息.一种解决方案是检查数组元素是否在给定的容差范围内,如下所示:

tolerance = 0.0001;
index = abs(A-B) <= tolerance;
Run Code Online (Sandbox Code Playgroud)

上面的内容将为您提供一个逻辑数组index,其中包含元素的所有元素,A并且B彼此在0.0001之内,否则为0.


Tho*_*mas 7

只需使用普通==运算符:

>> [1 2; 3 4] == [1 5; 6 4]      

ans =

     1     0
     0     1
Run Code Online (Sandbox Code Playgroud)