2014-04-23 8 views
1

나는 이미지에서 작업하고 최대 값 (이 경우 3165)으로 정규화했다.Matlab digits precision은 계산을 망칠 수 있습니다. 어떻게 피하는가?

는 몇 가지 작업 후, 나는 픽셀의 원래 값 일부 작업을하고 싶었던, 그래서 때문에 자리 정밀도, 모든 픽셀이 돌아갈 것입니다 3165

문제로 다시 곱 자신의 정수 값.

a=30/3165 

a = 

    0.0095 

>> b=a*3165 

b = 

    30.0000 

>> b-30 

ans = 

    3.5527e-15 

오류 자체가 매우 작습니다,하지만 난 다른 벡터에 대한 인덱스로 사용해야하고, 그것은 분명 작동하지 않을 것 : 예를 들어 30의 값을 가진 픽셀을 고려한다.

기술적으로 곱한 후에 round을 사용할 수 있습니다. 그것은 좋은 해결책이지만, 못생긴, 그리고이 문제를 해결하기 위해 적절한 방법과 좋은 연습처럼 느껴지지 않습니다.

누군가 다른 (더 전문적인) 아이디어가 있습니까? 아니면 이것을 할 수있는 방법입니까?

감사합니다.

+3

정수 값을 그대로 사용하십시오. 모든 프로그래밍 언어의 모든 부동 소수점 숫자는이 문제가 있습니다 (10 진수 시스템에서 정확하게 1/3을 표현할 수없는 것과 비슷합니다) –

+5

인덱스 인 경우 '3165'로 나누면 첫 번째 자리에서 '추한'것입니다 . – Divakar

+0

이것은 또 다른 옵션이지만 너무 간단하지는 않습니다. 이는 원본 이미지에서 이미 완료된 많은 작물 및 작업 이후에 발생하기 때문입니다. – Adiel

답변

2

아래에 언급 된 기술은 epsfix을 사용합니다. 이 경우에는 보다 덜 "못 생"합니다. 몇 가지 코드와 설명을 통해 단계별로 살펴 보겠습니다.

%%// Original indices 
org_indices = [15 30 45 60] 

%%// Scaled indices 
scaled_indices = org_indices/3165 

%%// Retrieved indices that are yet to be converted to exact integers 
retrieved_indices = scaled_indices*3165 

%%// Verify precision issue 
check_ind1 = retrieved_indices(1) - 15 

check_ind1 출력 1.7764e-15하고 정확하게 0이된다.

공식 MATLAB 설명서에 따르면 -이라고 적혀 있습니다. d = eps (X)이면 d는 abs (X)와 같은 정밀도의 크기 부동 소수점 숫자까지의 양의 거리입니다 다음

따라서 X.됨에 거리/오프셋을 계산할 수 -

eps_val = eps(retrieved_indices) 

eps_val이 요소가있는 경우는 상기에 대응해야하는 내에 결정 창 벡터로서 간주 될 수있다 또한 거짓말하는 정수 그것 안에. 우리는 우리의 의사 결정이 윈도우의 최대 값을 사용할 수 있습니다, 우리를 위해 쉽게하려면 그것은 매우 안전, 우리는이 10 배 폭 증가시킬 수 있도록하고 현실을 부르 자하는 것은 max_window_width -

max_window_width = 10*max(eps_val) 

이 아니다 반올림은 반올림과 마찬가지로 추측하기 때문에 반올림은 범위가 [-0.5 0.5]이기 때문에 1이라는 창 길이를 사용합니다. 반면이 창 길이는 7.1054e-14입니다.

check_ind2 = retrieved_indices2 -

retrieved_indices2 = fix(retrieved_indices + max_window_width) 

하나 정확성 값을 다시 확인할 수 -

마지막으로,이 최대 폭을 첨가하고 fix 사용 소수 부분을 절단함으로써 본래의 인덱스를 다시 얻을 수있다 (1) - 15 개

check_ind2 출력 0 01,230,936,864,475,.

+0

그것은 조금 덜 "못 생겼을 수 있습니다",하지만 정확히 내가 뭘 찾았는지 ... 다른 한편으로는 여기에 미용 솔루션이없는 것처럼 보입니다. – Adiel

+0

숫자를 잘라내어 숫자로 나누면 (대부분의 경우 3 x 10) 당신의 "아름다움"을 잃어 버리게됩니다. 그 시점 이후, 그것의 모든 회복. – Divakar

+0

아마도이 시점에서 가능합니다. 감사합니다. – Adiel

관련 문제