Function for 'does matrix contain value X?'

前端 未结 4 2063
天命终不由人
天命终不由人 2020-12-05 09:04

Is there a built in MATLAB function to find out if a matrix contains a certain value? (ala PHP\'s in_array())

相关标签:
4条回答
  • 2020-12-05 09:44

    For floating point data, you can use the new ismembertol function, which computes set membership with a specified tolerance. This is similar to the ismemberf function found in the File Exchange except that it is now built-in to MATLAB. Example:

    >> pi_estimate = 3.14159;
    >> abs(pi_estimate - pi)
    ans =
       5.3590e-08
    >> tol = 1e-7;
    >> ismembertol(pi,pi_estimate,tol)
    ans =
         1
    
    0 讨论(0)
  • 2020-12-05 09:50

    If you need to check whether the elements of one vector are in another, the best solution is ismember as mentioned in the other answers.

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

    However when you are dealing with floating point numbers, or just want to have close matches (+- 1000 is also possible), the best solution I found is the fairly efficient File Exchange Submission: ismemberf

    It gives a very practical example:

    [tf, loc]=ismember(0.3, 0:0.1:1) % returns false 
    [tf, loc]=ismemberf(0.3, 0:0.1:1) % returns true
    

    Though the default tolerance should normally be sufficient, it gives you more flexibility

    ismemberf(9.99, 0:10:100) % returns false
    ismemberf(9.99, 0:10:100,'tol',0.05) % returns true
    
    0 讨论(0)
  • 2020-12-05 09:58

    Many ways to do this. ismember is the first that comes to mind, since it is a set membership action you wish to take. Thus

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

    Since 15 is not prime, but 17 is, ismember has done its job well here.

    Of course, find (or any) will also work. But these are not vectorized in the sense that ismember was. We can test to see if 15 is in the set represented by X, but to test both of those numbers will take a loop, or successive tests.

    ~isempty(find(X == 15))
    ~isempty(find(X == 17))
    

    or,

    any(X == 15)
    any(X == 17)
    

    Finally, I would point out that tests for exact values are dangerous if the numbers may be true floats. Tests against integer values as I have shown are easy. But tests against floating point numbers should usually employ a tolerance.

    tol = 10*eps;
    any(abs(X - 3.1415926535897932384) <= tol)
    
    0 讨论(0)
  • 2020-12-05 10:02

    you can do:

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

    To do the above in a vectorized way, use:

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

    or as @woodchips suggests:

    ismember([5 7 11], A)
    
    0 讨论(0)
提交回复
热议问题