2014-04-03 133 views
0

我想比較浮點類型的N個數據。這種比較必須用容差來完成。N數據比較

這意味着如果2個數據(在N個數據中)之間的差值小於或等於容差,那麼這2個數據將被認爲是有效的,並且我得到一個數據,否則如果差值大於容差,那麼數據是無效的。

你有什麼想法嗎?

這裏是我的代碼:

float mytab[N]; 
int i,j,index=0; 
for (i = 0; i < N-1; i++) 
{ 
    for (j = i+1; j < N; j++) 
    { 
     if(tab[i].valid && tab[j].valid) 
     { 
      if (ABS(tab[i]-tab[j])<= toleance) 
      { 
      mytab[index] = tab[i]; 
      index++;  
      } 
     } 
    } 
    } 

//after i search the min value of mytab which constain a 
    valid value within tolerance. 

例子:

tolerance = 0.15; 
Data: 20.005, 20.017, 21.20, 21.25, 25.75, 25.9, 20.1 

在這個例子中,如果我們基於公差,我們可以選擇(20.005或20.017或20.1)OR(21.20 OR 21.25)。 但是,如果我們根據多數票投票,我們選擇20 ...而不是21 ...

+3

你我有辦法。但是,您能否提供您的嘗試?如果你至少嘗試了一些東西,SO可以幫助你。 – vishram0709

+0

是的,我嘗試過,但我沒有找到一個通用的算法。 – physics

+2

請嘗試編輯您的文章。 – vishram0709

回答

1

請讓自己更清楚。根據一組數字,您可以創建多個(不同的,不相交的)共享此屬性的子集。 如果您打算創建最大的子集,其值與原始超集的每個單值相比處於容差範圍內,而不是唯一的,但是您以錯誤的方式進行操作。對於集合中的每個值,如果它在集合中每個值的容差範圍內,都應該這樣做。只有在檢查完每一個號碼之後,才能包含它。

像這樣:

float mytab[N]; 
int marker=1; //marker that will tell if any number is outside tolerance range of some other element (then marker will be converted to 0 
int i,j,index=0; 
for (i = 0; i < N; i++) 
{ 
    marker=1 //for every new number, reset marker 
    for (j = 0; j < N; j++) 
    { 
     if(tab[i].valid && tab[j].valid) 
     { 
      if (fabs(tab[i]-tab[j])> toleance) 
      { 
      marker=0; 
      } 
     } 
    } 
    if(marker) 
     { 
     mytab[index]=tab[i]; index++; //marker will only be 1 if the number is within tolerance range of every element 
     } 
    } 

當然,這是一個非常inneficient代碼。最大範圍將在您的候選人編號和您的組中最小和最大的編號之間。所以,我會做的是對你的列表進行排序(或者只是發現哪些是你的設置中最大和最小的數字),並將每個元素與這兩個元素進行比較。如果他們在這些範圍內,他們與其他人一起。所以2比較每個數字,而不是n(或n/2,如果你比上面的代碼更聰明一點,就像你試圖成爲第一名)

1

如果我理解你的基本問題,你需要比較兩個花車。我認爲你已經接近ABS了......但是你需要中的浮點數fabs,C99

#include <stdio.h> 
#include <math.h> 

int main (void) 
{ 
    float f1 = 1.00001; 
    float f2 = 1.00003; 
    float tol= 0.00010; 

    if (fabs(f1 - f2) <= tol) { 
     puts("Test1: f1 and f2 are equal-ish."); 
    } else { 
     puts("Test1: f1 and f2 are not equal-ish."); 
    } 

    tol= 0.0000001; 
    if (fabs(f1 - f2) <= tol) { 
     puts("Test2: f1 and f2 are equal-ish."); 
    } else { 
     puts("Test2: f1 and f2 are not equal-ish"); 
    } 
} 

測試

$ cc -g -Wall -O0 -std=c99 -pedantic -o Test test.c && ./Test 
Test1: f1 and f2 are equal-ish. 
Test2: f1 and f2 are not equal-ish 
+0

我的問題不在於ABS,而是在很多值之間決定哪個值是正確的。我想用快速算法檢查每個兩個值。 – physics