我有两个1000行1000列的大阵列。我需要比较这些数组的每个元素,并在相应的元素相等时将另一个数组存储1。如何比较两个数组的所有元素?
我可以用for循环做这件事,但这需要很长时间。我怎样才能更快地做到这一点?
我有两个1000行1000列的大阵列。我需要比较这些数组的每个元素,并在相应的元素相等时将另一个数组存储1。如何比较两个数组的所有元素?
我可以用for循环做这件事,但这需要很长时间。我怎样才能更快地做到这一点?
如果两个矩阵A
和B
大小都一样,那么你可以这样做:
index = A == B;
和index
将是一个logical array与那些随处可见的A
和B
一个元素都是平等的,否则为零。
一个字的警告...
如果A
和B
包含整数,上面应该罚款。但是,如果它们包含浮点值,则可能会得到不希望的结果。上面的代码只有刚好等于的元素值为1。即使最小的差异也会导致元素被认为是不平等的。
有关处理“浮点运算的危险”的更多信息,请参阅this question's answers。一个解决办法是检查数组元素彼此是一个给定的公差范围内,像这样:
tolerance = 0.0001;
index = abs(A-B) <= tolerance;
上述会给你的人随处可见A
元素的逻辑阵列index
和B
不到0.0001彼此相反,否则为零。
Matlab具有函数eps,描述为浮点相对精度。您可以在gnovice的代码中使用它来代替容差变量。 index = abs(A-B)<= eps; – yuk 2010-02-04 20:37:24
eps是可以表示的最小值,不是吗?在这方面这不是非常有用。 – 2010-02-08 08:36:47
只需使用普通的==
操作:
>> [1 2; 3 4] == [1 5; 6 4]
ans =
1 0
0 1
给出的答案是正确的。我只想详细说明关于浮点测试的一些注意事项gnovice's。
当比较浮点数的相等性时,有必要使用容差值。通常使用两种类型的容差比较:绝对容差和相对容差。 (source)
的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)
总是,总是矢量化MATLAB代码,如果可能的话。 – Doresoom 2010-02-04 20:12:45
应该移到http://math.stackexchange.com/? – aaronsnoswell 2012-07-31 06:28:54