“矩阵是否包含值X?”的函数


72

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


对于可能需要公差的浮点数据,请注意,R2015a版本已添加了新功能,以使用单个内置功能来处理该数据。接受的整数值数据解决方案很棒,但对于浮点数,请跳到该答案。很抱歉自我提升,但是经过多年的询问,这对MATLAB来说是一个很大的补充。
chappjc 2015年

Answers:


99

有很多方法可以做到这一点。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)

2
这三个中最快的似乎是any。但是您可能想要自己测量(使用tictoc)。
Lewistrick

对于浮点值,如果至少使用R2015a,请使用ismembertol
chappjc

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)

您为什么在ismember中使用[5 7 11]作为参数
Jordan

1
@Jordan:返回的答案是一个与参数大小相同的逻辑数组(真/假),指示矩阵是否A包含这些值中的每一个(例如,[true, true, false]含义A包含这些值57但不包含11)。
Amro 2014年

1
@AnderBiguri:以下是一些可以比较的测试:gist.github.com/amroamroamro/e66ac6a88b0692d995fd
Amro

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

2

对于浮点数据,可以使用新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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.