函数为'matrix是否包含值X?'
是否有一个内置的MATLAB函数来发现一个matrix是否包含一个特定的值? (ala PHP的in_array()
)
许多方法来做到这一点。 ismember是首先想到的,因为它是一个你想要采取的一套会员行动。 从而
X = primes(20); ismember([15 17],X) ans = 0 1
既然15不是素质,但是17就是这个成绩在这里做得很好。
当然,find(或任何)也将工作。 但是这些并不是以成员的意义来说的vector化。 我们可以testing15是否在X代表的集合中,但是testing这两个数字将会循环或者连续的testing。
~isempty(find(X == 15)) ~isempty(find(X == 17))
要么,
any(X == 15) any(X == 17)
最后,我会指出,如果数字可能是真正的浮点数,testing精确值是危险的。 我已经显示的针对整数值的testing很容易。 但是对浮点数的testing通常应该使用一个容差。
tol = 10*eps; any(abs(X - 3.1415926535897932384) <= tol)
你可以做:
A = randi(10, [3 4]); %# a random matrix any( A(:)==5 ) %# does A contain 5?
要以vector化的方式完成上述操作,请使用:
any( bsxfun(@eq, A(:), [5 7 11] )
或者像@ woodchips所说的那样:
ismember([5 7 11], A)
如果你需要检查一个向量的元素是否在另一个向量中,那么最好的解决办法就是如其他答案中提到的那样。
ismember([15 17],primes(20))
但是,当你正在处理浮点数,或者只是想要近距离匹配(+ – 1000也是可能的),我发现最好的解决scheme是相当有效的文件交换提交: ismemberf
它给了一个非常实际的例子:
[tf, loc]=ismember(0.3, 0:0.1:1) % returns false [tf, loc]=ismemberf(0.3, 0:0.1:1) % returns true
虽然默认的容差通常应该足够,但它给了你更多的灵活性
ismemberf(9.99, 0:10:100) % returns false ismemberf(9.99, 0:10:100,'tol',0.05) % returns true
对于浮点数据,可以使用新的ismembertol
函数 ,它使用指定的容差计算集合成员资格。 这与File Exchange中的ismemberf
函数类似,不同之处在于现在内置于MATLAB。 例:
>> pi_estimate = 3.14159; >> abs(pi_estimate - pi) ans = 5.3590e-08 >> tol = 1e-7; >> ismembertol(pi,pi_estimate,tol) ans = 1