函数为'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