函数'是否包含值X?'

问题描述:

是否有内置的MATLAB函数来查明矩阵是否包含某个值? (ALA PHP的in_array()函数'是否包含值X?'

+0

对于需要容差的浮点数据,请注意,版本R2015a增加了新功能来处理这种情况,只需一个内置函数。整数值数据接受的解决方案是伟大的,但对于浮动,跳转到[这个答案](http://*.com/a/28907857/2778484)。对不起,自我推销,但这是多年来人们问的MATLAB的一个很大的补充。 – chappjc 2015-03-06 21:32:05

许多方法可以做到这一点。 ismember是第一个想到的,因为它是你想要采取的一套会员制行动。因此,

X = primes(20); 
ismember([15 17],X) 
ans = 
     0 1 

由于15不是素数,而是17,因此ismember在这里做得很好。

当然,找到(或任何)也将工作。但是,这些都不是矢量化的,因为它是成员。我们可以测试15是否在X表示的集合中,但要测试这两个数字将需要一个循环或者连续的测试。

~isempty(find(X == 15)) 
~isempty(find(X == 17)) 

,或者

any(X == 15) 
any(X == 17) 

最后,我想指出的是,对于精确值测试是危险的,如果这些数字可能是真实的浮动。按照我所显示的对整数值进行测试很容易。但是对浮点数的测试通常应该使用一个容差。

tol = 10*eps; 
any(abs(X - 3.1415926535897932384) <= tol) 
+2

三者中最快的似乎是“任何”。但是你可能想自己测量一下(使用'tic'和'toc')。 – Lewistrick 2014-07-03 12:55:57

+0

对于浮点值,如果您至少使用R2015a,只需使用['ismembertol'](http://*.com/a/28907857/2778484)。 – chappjc 2015-12-29 21:58:29

,你可以这样做:

A = randi(10, [3 4]);  %# a random matrix 
any(A(:)==5)    %# does A contain 5? 

要做到上述的矢量方式,使用方法:

any(bsxfun(@eq, A(:), [5 7 11]) 

@woodchips提示:

ismember([5 7 11], A) 
+0

为什么你在ismember – Jordan 2014-07-10 15:05:18

+1

@Jordan中使用[5 7 11]作为参数:返回的答案是与参数大小相同的逻辑数组(真/假),指示矩阵“A”是否包含每个值(例如'[true,true,false]'含义'A'包含数值'5'和'7',但不包含'11')。 – Amro 2014-07-10 15:54:12

+0

现在我明白了,谢谢 – Jordan 2014-07-10 15:55:30

如果您需要检查一个向量的元素是否在另一个,最好的解决办法是ismember在其他的答案中提到。

ismember([15 17],primes(20)) 

然而,当你正在处理浮点数,或者只是想有接近的比赛(+ - 1000也是可以的),我找到了最好的解决方案是相当有效File Exchange Submission: 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 function,它计算具有指定公差的集合成员资格。这与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