“矩阵是否包含值 X?”

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

107215 次浏览

你可以:

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

若要以 矢量化的方式执行上述操作,请使用:

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

或者正如 @ woodchip所建议的那样:

ismember([5 7 11], A)

有很多方法可以做到这一点。Ismember 是我首先想到的,因为它是您希望采取的一个固定的成员操作。因此

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

因为15不是质数,但17是,ismember 在这里做得很好。

当然,find (或任何)也会起作用。但是这些并不是像 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)

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

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

但是,当您处理浮点数时,或者只是希望有接近的匹配(+-1000也是可能的) ,我发现的最佳解决方案是相当有效的 文件交换提交: 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功能,它计算设置成员资格 具有特定的公差。这类似于文件交换中的 ismemberf函数,只是它现在内置在 MATLAB 中。例如:

>> pi_estimate = 3.14159;
>> abs(pi_estimate - pi)
ans =
5.3590e-08
>> tol = 1e-7;
>> ismembertol(pi,pi_estimate,tol)
ans =
1