我有两个大数组,大约有1000行和1000列。我需要比较这些数组的每个元素,并在另一个数组中存储1,如果对应的元素相等。
我可以使用for循环来实现,但是这需要很长时间。我该如何更快地完成这个任务?
我有两个大数组,大约有1000行和1000列。我需要比较这些数组的每个元素,并在另一个数组中存储1,如果对应的元素相等。
我可以使用for循环来实现,但是这需要很长时间。我该如何更快地完成这个任务?
a
和 b
的绝对容差比较如下:|a-b| < tol
相对容差比较如下:
|a-b| < tol*max(|a|,|b|) + tol_floor
你可以将上述两个函数实现为匿名函数:
%# 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) );
然后你可以这样使用它们:
%# let x and y be scalars/vectors/matrices of same size
x == y
isequalAbs(x, y, 1e-6)
isequalRel(x, y, 1e-6)
isequal(0.3,0.1*3)
,它等同于 0.3 == 0.1*3
。两者的答案都是错误的! - Amrotol * eps(max(abs(x),abs(y)))
的东西,这应该会在x
和y
值范围内给您浮点精度(乘以tol
)。 - gnovicetol_floor
值在a
和b
非常接近0时作为绝对公差的作用。我只是选择使用eps
。事实上,如果你想的话可以省略它并定义为:abs(x-y) <= tol*max(abs(x),abs(y))
,其中用户选择tol
的值(一个很好的默认值是1e-8
)。 - Amroeps
吗:abs(x-y) < max( abs( eps(x), eps(y) ) )
? - user2469775A
和 B
大小相同,那么你可以这样做:index = A == B;
而且index
将是一个逻辑数组,在A
和B
的元素相等时处处为1,否则为0。
警告...
如果A
和B
包含整数,则上述内容应该是可以接受的。然而,如果它们包含浮点值,则可能会得到不想要的结果。上面的代码仅在元素完全相等时才有值为1。即使最小的差异也会导致元素被认为是不相等的。
您可以查看这个问题的答案,以获取有关“浮点操作危险”的更多信息。一种解决方法是检查数组元素是否彼此之间在给定的容差范围内,如下所示:
tolerance = 0.0001;
index = abs(A-B) <= tolerance;
以上代码将为您提供一个逻辑数组 index
,其中每个与A
和B
元素的差值在0.0001以内的位置都标记为1,否则标记为0。
只需使用常规的==
运算符:
>> [1 2; 3 4] == [1 5; 6 4]
ans =
1 0
0 1