是否有一个内置的 MATLAB 函数来确定一个矩阵是否包含一个确定的值? (ala PHP 的 in_array())
in_array()
你可以:
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
ismember([15 17],primes(20))
但是,当您处理浮点数时,或者只是希望有接近的匹配(+-1000也是可能的) ,我发现的最佳解决方案是相当有效的 文件交换提交: ismemberf
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 中。例如:
ismembertol
>> pi_estimate = 3.14159; >> abs(pi_estimate - pi) ans = 5.3590e-08 >> tol = 1e-7; >> ismembertol(pi,pi_estimate,tol) ans = 1