Вы конвертируете значения с плавающей запятой в char 4 раза, но сохраняете только последнее преобразование.В то же время мы удалим if
и %
, а также избежим лишних делений.Попробуйте это:
float* binnedLine = new float[lineSize];
char* binnedLineInt = new char[lineSize];
for (int j = 0; j < nlines; j += binsize)
{
for (int i = 0; i < lineSize; ++i)
{
binnedLine[i] = static_cast<float>(data[j*lineSize + i]);
};
for (int k = 1; k < binsize; ++k)
{
for (int i = 0; i < lineSize; ++i)
{
binnedLine[i] += static_cast<float>(data[(j+k)*lineSize + i]);
};
}
for (int i = 0; i < lineSize; ++i)
{
binnedLineInt[i] = static_cast<char>(binnedLine[i] / binsize);
}
...
}
Но, как сказал @ MSalters в комментарии , вам, вероятно, лучше сразу получить доступ к четырем строкам, так как это позволит избежать удержания и записи в дополнительный float.буфер:
char* binnedLineInt = new char[lineSize];
for (int j = 0; j < nlines; j += binsize)
{
for (int i = 0; i < lineSize; ++i)
{
float sum = static_cast<float>(data[j*lineSize + i]);
for (int k = 1; k < binsize; ++k)
{
sum += static_cast<float>(data[(j+k)*lineSize + i]);
}
binnedLineInt[i] = static_cast<char>(sum / binsize);
}
...
}
Кроме того, более короткий код легче понять и легче поддерживать.