我有两个大约 1000 行和 1000 列的大数组。如果相应的元素相等,我需要比较这些数组的每个元素并将 1 存储在另一个数组中。
我可以用 for 循环来做到这一点,但这需要很长时间。我怎样才能更快地做到这一点?
我有两个大约 1000 行和 1000 列的大数组。如果相应的元素相等,我需要比较这些数组的每个元素并将 1 存储在另一个数组中。
我可以用 for 循环来做到这一点,但这需要很长时间。我怎样才能更快地做到这一点?
给出的答案都是正确的。我只是想详细说明一下gnovice关于浮点测试的评论。
在比较浮点数是否相等时,需要使用容差值。通常使用两种类型的公差比较:绝对公差和相对公差。(来源)
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)
如果您的两个矩阵A
和B
大小相同,那么您可以这样做:
index = A == B;
andindex
将是一个逻辑数组,其中的元素处处为A
和B
,否则为零。
一句警告...
如果A
和B
包含整数,上面应该没问题。但是,如果它们包含浮点值,您可能会得到不希望的结果。对于完全相等的元素,上面的代码只会有值 1 。即使是最小的差异也会导致元素被认为是不平等的。
您可以查看此问题的答案以获取有关处理“浮点运算的危险”的更多信息。一种解决方案是检查数组元素是否在彼此的给定容差范围内,如下所示:
tolerance = 0.0001;
index = abs(A-B) <= tolerance;
以上将为您提供一个逻辑数组index
,其中的元素A
和的元素B
在 0.0001 范围内,否则为零。
只需使用普通==
运算符:
>> [1 2; 3 4] == [1 5; 6 4]
ans =
1 0
0 1