【问题标题】:How to calculates the average of elements in an unsigned char array?如何计算无符号字符数组中元素的平均值?
【发布时间】:2011-02-10 04:08:03
【问题描述】:

我有一个快速,我假设问题,但我无法在网上找到任何东西。

如何计算 unsigned char 数组中元素的平均值? 或者更像它,对无符号字符执行操作?

【问题讨论】:

  • 你知道如何取数据集的平均值吗?你了解数组的概念吗?您想了解使用数组的语法吗?你想用 C 或 C++ 来做吗? (C 和 C++ 是不同的语言。你会得到不同的答案。[c][c++] 标签不等价!)

标签: c++ c unsigned-char


【解决方案1】:

C++03 和 C++0x:

#include <numeric>

int count = sizeof(arr)/sizeof(arr[0]);
int sum = std::accumulate<unsigned char*, int>(arr,arr + count,0);
double average = (double)sum/count;

在线演示:http://www.ideone.com/2YXaT


仅限 C++0x(使用 lambda)

#include <algorithm>

int sum = 0;
std::for_each(arr,arr+count,[&](int n){ sum += n; });
double average = (double)sum/count;

在线演示:http://www.ideone.com/IGfht

【讨论】:

    【解决方案2】:

    算术运算在 unsigned char 上工作得很好,尽管您可能偶尔会惊讶于 C 中的算术总是提升为 int

    在 C++ 的标准模板库中,

    #include <numeric>
    template<class InputIterator, class T>
    T accumulate(InputIterator first, InputIterator last, T init);
    

    要计算unsigned char arr[] 的总和,您可以使用accumulate(arr, arr + sizeof(arr) / sizeof(arr[0]), 0)。 (这里的 0 是 int。您可能会发现使用其他类型更合适。)

    如果没有 STL,这可以通过循环简单地计算出来。

    平均值是总和除以长度 (sizeof(arr) / sizeof(arr[0]))。

    【讨论】:

    • 如何保存无符号字符值?假设 sum += unSignedCharArray[i][j]。 sum 的类型是什么?
    • @Everton:查看我的完整解决方案。总和存储在int 类型变量中!
    • 你能告诉我如何在没有 STL 的情况下实现吗?我是初学者,这对我有很大帮助!谢谢!
    【解决方案3】:

    与其他任何事情一样,您将它们相加并除以计数。为避免溢出,您通常希望在进行数学运算时将它们转换为更大的值。如果(通常)您想要一个浮点结果,那么您也需要对浮点进行所有数学运算。

    【讨论】:

    • 不需要把所有的数学都当作浮点数。您可以等到完成总和后再进行转换。如果你的整数是 32 位的,你需要一个 24MB 的数组才有可能溢出,所以我认为将总和保存在 unsigned int 中是完全合理的。
    • (如果有溢出的可能,由于精度损失,您将很难用浮点数正确地编写代码!)
    • @R.:是的,对于完全按照说明的工作,32 位 int 有相当大的机会足够 - 但是,1)它不会总是如此,并且 2)这样做是相对脆弱的,因此(例如)输入类型中看似微小的更改可能会破坏“已知工作”代码。曾几何时,使用浮点非常昂贵,值得尽可能避免使用,但情况已经改变。事实上,一些 CPU 现在通过将数据转换为 FP 来执行一些整数运算,执行操作,将结果转换回整数。显然在这种情况下,使用 FP 并不是一个大问题……
    • 如果没有别的,你需要明确你的意思是double,而不是float,因为float会出现更严重的溢出问题(在大量元素之后,大约32k,被添加,添加更多元素不会改变总和!)更难检测和更难解决。国际海事组织,在你真的不想要它的语义的任何时候使用浮点是一个巨大的编程错误,除非你是数值分析专家,否则肯定会咬你。
    猜你喜欢
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多