ano*_*non 16 comparison matlab matrix vectorization
我有两个大数组,大约1000行和1000列.我需要比较这些数组的每个元素,如果相应的元素相等,则将1存储在另一个数组中.
我可以使用for循环但这需要很长时间.我怎么能更快地做到这一点?
Amr*_*mro 29
给出的答案都是正确的.我只是想详细说明gnovice关于浮点测试的评论.
比较浮点数是否相等时,必须使用容差值.通常使用两种类型的公差比较:绝对公差和相对公差.(来源)
绝对容差比较a和b看起来像:
|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)
gno*_*ice 12
如果你的两个矩阵A和B大小都一样,那么你可以这样做:
index = A == B;
Run Code Online (Sandbox Code Playgroud)
并且index将是一个逻辑数组,其中包含的元素是A和,B并且相等,否则为零.
一句警告......
如果A并B包含整数,则上述情况应该没问题.但是,如果它们包含浮点值,则可能会得到不希望的结果.对于完全相同的元素,上面的代码只有一个值.即使是最小的差异也会导致元素被认为是不相等的.
您可以查看此问题的答案,以获取有关处理"浮点运算的危险"的更多信息.一种解决方案是检查数组元素是否在给定的容差范围内,如下所示:
tolerance = 0.0001;
index = abs(A-B) <= tolerance;
Run Code Online (Sandbox Code Playgroud)
上面的内容将为您提供一个逻辑数组index,其中包含元素的所有元素,A并且B彼此在0.0001之内,否则为0.