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

Matlab 如何比较两个数组的所有元素?,matlab,comparison,matrix,vectorization,Matlab,Comparison,Matrix,Vectorization,我有两个大数组,大约有1000行和1000列。我需要比较这些数组中的每个元素,如果对应的元素相等,则在另一个数组中存储1 我可以用for循环来实现这一点,但这需要很长时间。如何更快地执行此操作?如果两个矩阵A和B的大小相同,则可以执行以下操作: index = A == B; 而index将是a,其中a和B的元素处处都是1,否则等于0 一句警告的话… 如果A和B包含整数,则可以使用上述参数。但是,如果它们包含浮点值,则可能会得到不需要的结果。对于完全相等的元素,上面的代码只有一个值。即使是最小

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


我可以用for循环来实现这一点,但这需要很长时间。如何更快地执行此操作?

如果两个矩阵
A
B
的大小相同,则可以执行以下操作:

index = A == B;
index
将是a,其中
a
B
的元素处处都是1,否则等于0

一句警告的话…

如果
A
B
包含整数,则可以使用上述参数。但是,如果它们包含浮点值,则可能会得到不需要的结果。对于完全相等的元素,上面的代码只有一个值。即使是最小的差异也会导致元素被视为不相等

您可以查看以了解有关处理“浮点操作的危险”的更多信息。一种解决方案是检查阵列元素是否在彼此的给定公差范围内,如下所示:

tolerance = 0.0001;
index = abs(A-B) <= tolerance;
公差=0.0001;

index=abs(A-B)只需使用正常的
=
操作符:

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

ans =

     1     0
     0     1

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

比较浮点数是否相等时,必须使用公差值。通常使用两种公差比较:绝对公差和相对公差。()

a
b
的绝对公差比较如下所示:

|a-b| < tol
|a-b| < tol*max(|a|,|b|) + tol_floor

总是,总是尽可能的矢量化MATLAB代码。应该移动到?MATLAB有函数eps,描述为浮点相对精度。您可以在gnovice的代码中使用它来代替公差变量。指数=abs(A-B)每股收益是可以表示的最小值,不是吗?这在本文中不是很有用。请尝试:
isequal(0.3,0.1*3)
,它相当于
0.3==0.1*3
。两者的答案都是错误的!我的道歉-我想我对MATLAB的信任是错误的!我现在必须修改很多代码:(关于使用EPS的一点:它也是一个相对函数。无参数调用EPS可以让您获得从1.0到下一个最大双精度数的距离。对于第二个匿名函数,您可能希望使用类似于
tol*EPS(max(abs(x),abs(y))的东西)
,这将为您提供
x
y
中的值范围内的浮点精度(乘以
tol
)。另外,
isequal
返回一个布尔值;OP需要一个二进制函数,该函数接受两个大小相同的矩阵并生成一个大小相同的布尔矩阵。@gnovice:实际上这是不正确的。如果您遵循我引用的链接(MATLAB xUnit framework文档的一部分),它解释了当
a
b
非常接近0时,
tol\u floor
值充当绝对公差。我只是选择使用
eps
。事实上,如果需要,您可以省略它,并将其定义为:
abs(x-y)
%# 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)