programing tip

'행렬에 값 X가 포함되어 있습니까?'에 대한 함수

itbloger 2020. 11. 5. 07:47
반응형

'행렬에 값 X가 포함되어 있습니까?'에 대한 함수


행렬에 특정 값이 포함되어 있는지 알아내는 MATLAB 함수가 내장되어 있습니까? (ala PHP의 in_array())


이를 수행하는 다양한 방법. ismember는 당신이 취하고 싶은 일련의 멤버십 행동이기 때문에 가장 먼저 떠오르는 것입니다. 그러므로

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

15는 소수가 아니지만 17은 소수이기 때문에 ismember는 여기서 잘했습니다.

물론 find (또는 any)도 작동합니다. 그러나 이것들은 ismember라는 의미에서 벡터화되지 않았습니다. X가 나타내는 집합에 15가 있는지 테스트 할 수 있지만 두 숫자를 테스트하려면 루프 또는 연속 테스트가 필요합니다.

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

또는,

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

마지막으로 숫자가 실제 수 레일 수 있다면 정확한 값에 대한 테스트가 위험하다는 점을 지적합니다. 내가 보여준 것처럼 정수 값에 대한 테스트는 쉽습니다. 그러나 부동 소수점 수에 대한 테스트는 일반적으로 허용 오차를 사용해야합니다.

tol = 10*eps;
any(abs(X - 3.1415926535897932384) <= tol)

넌 할 수있어:

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다른 답변에서 언급 한 것입니다.

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함수를 사용할 수 있습니다 . 이는 이제 MATLAB에 내장된다는 점을 제외하면 파일 교환에 있는 함수 와 유사합니다 . 예:ismemberf

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

참고 URL : https://stackoverflow.com/questions/1913670/function-for-does-matrix-contain-value-x

반응형