'矩阵包含值X?'的函数

时间:2009-12-16 10:15:47

标签: matlab function matrix floating-point

是否有内置的MATLAB函数来确定矩阵是否包含某个值? (ala PHP的in_array()

4 个答案:

答案 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