是否有内置的MATLAB函数来确定矩阵是否包含某个值?
(ala PHP的in_array()
)
答案 0 :(得分:98)
许多方法都可以做到这一点。 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)
答案 1 :(得分:11)
你可以这样做:
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)
答案 2 :(得分:3)
如果你需要检查一个向量的元素是否在另一个向量中,最好的解决方案是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
答案 3 :(得分:2)
对于浮点数据,您可以使用新的ismembertol
function,它计算具有指定容差的集合成员 。这与文件交换中的ismemberf
函数类似,不同之处在于它现在内置于MATLAB中。例如:
>> pi_estimate = 3.14159;
>> abs(pi_estimate - pi)
ans =
5.3590e-08
>> tol = 1e-7;
>> ismembertol(pi,pi_estimate,tol)
ans =
1