сортировка бина гистограммы c ++

Я пишу функцию для клонирования функции гистограммы надстройки анализа данных в Excell. По сути, предоставляется ввод данных выборки, а затем диапазон ячеек. Диапазоны бина должны быть монотонно увеличивающимися, и в моем случае должны быть конкретно [0 20 40 60 80 100]. Excell вычисляет, попадает ли образец в диапазон бина, если он больше нижней границы (левый край) и меньше или равен верхней границе (правый край).

Я написал алгоритм сортировки бинов ниже, и он дает неправильный вывод для data0 (очень близко), но правильный вывод для data1 и data2. Правильное в этом случае означает, что выходные данные этого алгоритма точно совпадают с выходными данными в таблице, которую Excell генерирует, где количество выборок подсчитывается рядом с ячейкой. Любая помощь приветствуется!

#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;
}

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 интервал.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector