2013-03-04 3 views
1

Excell의 데이터 분석 추가 기능의 히스토그램 기능을 복제하는 함수를 작성했습니다. 기본적으로 샘플 데이터의 입력이 제공되고 bin 범위도 제공됩니다. bin 범위는 단조롭게 증가해야하며 제 경우에는 구체적으로 [0 20 40 60 80 100]이어야합니다. Excell은 샘플이 하한 (왼쪽 가장자리)보다 크고 상한 (오른쪽 가장자리)보다 작거나 같은 경우 빈 범위로 떨어지는 지 계산합니다.C++ 히스토그램 빈 정렬

아래의 빈 정렬 알고리즘을 작성했으며 data0 (매우 가깝습니다)에 대해 부적절한 결과를 제공하지만 data1 및 data2에 대한 적절한 출력을 제공합니다. 이 경우 적절한 것은이 알고리즘의 출력이 표의 출력과 정확하게 일치 함을 의미합니다. Excell은 샘플 수를 bin 옆에서 계산합니다. 어떤 도움을 주셔서 감사합니다! 가장자리를 가정

#include <iostream> 

int main(int argc, char **agv) 
{ 
    const int SAMPLE_COUNT  = 21; 
    const int BIN_COUNT   = 6; 
    int binranges[BIN_COUNT] = {0, 20, 40, 60, 80, 100}; 
    int bins[BIN_COUNT]   = {0, 0, 0, 0, 0, 0}; 

    int data0[SAMPLE_COUNT] = {4,82,49,17,89,73,93,86,74,36,74,55,81,61,88,94,72,65,35,25,79}; 
    // for data0 excell's bins read: 
    // 0 0 
    // 20 2 
    // 40 3 
    // 60 2 
    // 80 7 
    // 100 7 
    // 
    // instead output of bins is: 203277 

    int data1[SAMPLE_COUNT] = {88,83,0,0,95,86,0,94,92,77,94,73,93,90,50,95,93,83,0,95,91}; 
    //for data1 excell and this algorithm both yield: 
    // 0 4 
    // 20 0 
    // 40 0 
    // 60 1 
    // 80 2 
    // 100 14 (correct) 

    int data2[SAMPLE_COUNT] = {58,48,75,68,85,78,74,83,83,75,67,58,75,58,84,68,57,88,55,79,72}; 
    //for data2 excell and this algorithm both yield: 
    // 0 0 
    // 20 0 
    // 40 0 
    // 60 6 
    // 80 10 
    // 100 5 (correct) 

    for (unsigned int binNum = 1; binNum < BIN_COUNT; ++binNum) 
    { 
     const int leftEdge = binranges[binNum - 1]; 
     const int rightEdge = binranges[binNum]; 

     for (unsigned int sampleNum = 0; sampleNum < SAMPLE_COUNT; ++sampleNum) 
     { 
      const int sample = data0[sampleNum]; 

      if (binNum == 1) 
      { 
       if (sample >= leftEdge && sample <= rightEdge) 
        bins[binNum - 1]++; 
      } 
      else if (sample > leftEdge && sample <= rightEdge) 
      { 
       bins[binNum]++; 
      } 
     } 
    } 

    for (int i = 0; i < BIN_COUNT; ++i) 
     std::cout << bins[i] << " " << std::flush; 

    std::cout << std::endl << std::endl; 

    return 0; 
} 
+0

내 대답을주기 전에 뭔가가 나를 벗어났습니다. 입력 값 중 하나에 0 (또는 음수 값)을 입력하면 무엇이 우수합니까? 그것은 당신의 정의에서 어떤 빈에 맞지 않아야합니다. – didierc

+0

내 생각에 내 의견을 내 대답이라고 생각합니다. 내 업데이트를 참조하십시오. – didierc

답변

1

가 증가하는 순서로 항상, 당신이 필요로하는 모든입니다

 unsigned int bin; 
    for (unsigned int sampleNum = 0; sampleNum < SAMPLE_COUNT; ++sampleNum) 
    { 
      const int sample = data0[sampleNum]; 
      bin = BIN_COUNT; 
      for (unsigned int binNum = 0; binNum < BIN_COUNT; ++binNum) { 
       const int rightEdge = binranges[binNum]; 
       if (sample <= rightEdge) { 
        bin = binNum; 
        break; 
       } 
      } 
      bins[bin]++; 
     } 

이 코드가 작동하려면, 당신은 동일한 값에 대한 또 하나의 빈을 추가해야합니다,하지만 또는 첫 번째 가장자리 (0) 아래.

n 개의 분리 기호가 있으면 n + 1 개의 간격을 갖습니다.

+0

이 출력은 [2, 3, 2, 7, 7, 0]이지만, [0 2 3 2 7 7]은 우수합니다. 이 차이는 나중에 그래프로 나타낼 때 커질 수 있습니다. 원래의 시도로도 같은 결과를 얻었지만 Excell은 다르게 수행합니다 – rem45acp

+0

다른 샘플 데이터 세트가 제공되면 {87,92,86,57,96,60,0,96,93,55,68,77 , 85,77,77,93,69,74,32,86,43}이면 Excel에서 [1 0 4 6 9]를 생성하지만 [1 1 4 6 9 0]? – rem45acp

+0

코드를 약간 수정 했으므로 테스트하고 싶다면 다시 모든 것을 c & p하십시오. – didierc