是否有内置的MATLAB函数来确定矩阵是否包含某个值?(ala PHP的in_array()
)
Answers:
有很多方法可以做到这一点。ismember是第一个想到的成员,因为这是您希望采取的固定成员资格操作。从而
X = primes(20);
ismember([15 17],X)
ans =
0 1
因为15不是素数,但是17是,ismember在这里做得很好。
当然,查找(或任何查找)也将起作用。但是这些不是按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)
any
。但是您可能想要自己测量(使用tic
和toc
)。
ismembertol
。
你可以做:
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)
A
包含这些值中的每一个(例如,[true, true, false]
含义A
包含这些值5
,7
但不包含11
)。
如果您需要检查一个向量的元素是否在另一个向量中,则最佳解决方案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
函数,该函数以指定的公差计算集合成员资格。此功能类似于ismemberf
文件交换中的功能,只不过它已内置在MATLAB中。例:
>> pi_estimate = 3.14159;
>> abs(pi_estimate - pi)
ans =
5.3590e-08
>> tol = 1e-7;
>> ismembertol(pi,pi_estimate,tol)
ans =
1