2012-11-07 3 views
0

배열의 double 값을 만들었습니다. find 명령을 사용하여 배열에서 특정 값의 인덱스를 검색하려면이 값을 사용합니다. 빈 행렬은 내가 원한 것이 아닙니다. 난 문제가 배열의 판독 값에 표시되지 않은 값 및/또는 소수 자릿수의 정밀도에 있다고 가정합니다.MATLAB : find 함수를 사용하여 배열의 특정 값에 대한 인덱스를 얻습니다.

명령

peaks=find(y1==0.8236) 

어레이 판독 :

y1 = 

Columns 1 through 11 

0.2000 0.5280 0.8224 0.4820 0.8239 0.4787 0.8235 0.4796 0.8236 0.4794 0.8236 

Columns 12 through 20 

0.4794 0.8236 0.4794 0.8236 0.4794 0.8236 0.4794 0.8236 0.4794 

출력 :

peaks = 

Empty matrix: 1-by-0 

I 명령

format short 
를 사용하여 시도

하지만 이것은 배열의 실제 값이 아니라 표시된 값만 자릅니다.

어떻게 색인 배열을 제공하기 위해 find 명령을 사용할 수 있습니까?

답변

3

는 매트랩 수치 행렬의 각 요소는 부동 소수점 배정 밀도를 사용하여 저장됩니다 : 당신이 아마하고 싶은 목표 값에 충분히 가까이 을있는 번호를 볼 수있는 테스트입니다. 질문에 format shortformat long으로 추측 할 때 숫자의 실제 형식이 아닌 표시된 형식 만 변경하면됩니다.

그래서 y1 경우 것이 y1 = rand(100, 1) 같은 것을 사용하여, 당신은 find를 사용 y1에서 특정 요소를 찾으려 만들어집니다, 당신은 당신이 지점 배정 밀도 부동을 찾고있는 요소의 정확한 값을 알아야합니다 - 어떤 귀하의 응용 프로그램에 따라 아마 사소한 것입니다. peaks=find(y1==0.8236)은 에만 0.823622378...

과 같은 값이 포함 된 경우 빈 행렬을 반환합니다. 따라서이 문제를 해결하는 방법은 무엇입니까? 그것은 귀하의 응용 프로그램에 따라 다릅니다.한 가지 방법은 y1의 모든 값을 원하는 정밀도로 잘라내는 것입니다. 재미있게도이 주제에 대한 SO matlab 질문은 약 12 ​​시간 전에 두 가지 좋은 답변을 얻었습니다. 자세한 내용은 here을 참조하십시오.

a = 1e-4 %# Define level of precision 
y1Round = round((1/a) * y1); %# Round to appropriate precision, and leave y1 in integer form 
Index = find(y1Round == SomeValue); %# Perform the find operation 

주 나는 정수 형태로 y1Round으로 find 명령을 사용하여이 경로를 아래로 이동하기로 결정하는 경우

, 나는 이런 식으로 뭔가를 추천 할 것입니다. 정수는 부동 소수점 double을 사용할 때 정확하게 저장되기 때문에 부동 소수점 정밀도에 대해 걱정할 필요가 없습니다.

이 문제에 대한 또 다른 접근 방법은 예를 들어, 오류에 대한 몇 가지 허용 오차 find을 사용하는 것입니다 : 당신이 선택한 경로

Index = find(abs(y1 - SomeValue) < Tolerance); 

당신에게 달려 있습니다. 그러나 이러한 접근법을 채택하기 전에 응용 프로그램을 잘 살펴보고 특정 방식으로 "실제"숫자를 검색 할 필요가 없도록 재구성 할 수 있는지 확인하십시오. 진짜 ". 그것은 가장 이상적인 결과 일 것입니다.

편집 :이 질문에 대한 다른 두 가지 답변에서 옹호 한 코드는 제 두 번째 방법보다 낫습니다. 그래서 그에 맞게 수정했습니다.

1

문제는 실제로 정밀도입니다. 실제 어레이에는 각 숫자에 대해 더 많은 숫자가 있으므로 표시되는 배열은 실제 배열이 아닙니다. 형식을 변경하면 배열이 표시되는 방식이 변경되므로 문제가 해결되지 않습니다.

두 가지 옵션 중 하나를 사용하여 배열을 수정하거나 찾고있는 것을 수정할 수 있습니다. 찾고있는 것을 수정하는 것이 더 나을 것입니다. 그 이후로는 실제 값을 변경하지 않기 때문입니다.

그래서 대신 평등, 당신이 (그래서 배열의 당신이 찾고있는 번호와 숫자의 차이는 몇 가지 작은 엡실론 가장에있다) 근접도 찾아보실 수 있습니다 찾고 :

peaks = find(abs(y1-0.8236) < epsilon) 

일반적으로 부동 소수점을 처리 할 때는 항상 정확한 비교를 피하고 오류 임계 값을 사용하십시오.이 수의 표현이 제한되어 있으므로 종종 작은 부정확성으로 저장됩니다.

+0

+1 내 대답과 동일한 대답입니다. 건배. –

2

부동 소수점 수와 동등성을 테스트하는 것은 거의 잘못된 생각입니다. 기본적으로

peaks = find(abs(y - .8236) < .0001); 
+0

+1 내 대답과 동일한 대답입니다. 건배. –

관련 문제