函数'是否包含值X?'
许多方法可以做到这一点。 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)
三者中最快的似乎是“任何”。但是你可能想自己测量一下(使用'tic'和'toc')。 – Lewistrick 2014-07-03 12:55:57
对于浮点值,如果您至少使用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)
如果您需要检查一个向量的元素是否在另一个,最好的解决办法是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
对于需要容差的浮点数据,请注意,版本R2015a增加了新功能来处理这种情况,只需一个内置函数。整数值数据接受的解决方案是伟大的,但对于浮动,跳转到[这个答案](http://*.com/a/28907857/2778484)。对不起,自我推销,但这是多年来人们问的MATLAB的一个很大的补充。 – chappjc 2015-03-06 21:32:05