mean,median,mode,var,std,min,max函数

剩余的函数都放在这篇里面吧

  • meanmeanmean函数可以求平均值
    aaa为向量时,mean(a)mean(a)mean(a)求向量中元素的平均值
    aaa为矩阵时,mean(a,1)mean(a,1)mean(a,1)求矩阵中各列元素的平均值;mean(a,2)mean(a,2)mean(a,2)求矩阵中各行元素的平均值

  • medianmedianmedian函数可以求中位数
    aaa为向量时,median(a)median(a)median(a)求向量中元素的中位数
    aaa为矩阵时,median(a,1)median(a,1)median(a,1)求矩阵中各列元素的中位数;median(a,2)median(a,2)median(a,2)求矩阵中各行元素的中位数

  • modemodemode函数可以求众数
    aaa为向量时,mode(a)mode(a)mo

<think> 我们正在讨论C++中计算中位数的函数实现和使用。 根据C++标准库,目前并没有一个直接名为median函数。但是我们可以通过使用标准库中的算法和容器来实现中位数的计算。 中位数是将一组数据按顺序排列后位于中间位置的值。如果数据个数为奇数,则中位数是中间那个数;如果为偶数,则中位数是中间两个数的平均值。 实现步骤: 1. 将数据放入一个容器(如vector)中。 2. 对容器进行排序(使用std::sort)。 3. 判断容器大小的奇偶性,然后计算中位数。 注意:由于中位数计算需要排序,所以会改变原容器的顺序。如果不希望改变原容器,可以先复制一份。 另外,C++17在<numeric>头文件中引入了std::reduce和std::transform_reduce等,但没有直接的中位数函数。 我们可以自己编写一个函数来实现: 示例代码: ```cpp #include <algorithm> #include <vector> #include <stdexcept> // for std::domain_error // 函数模板,适用于任何可以排序的容器(如vector, array等) template<typename T> double median(std::vector<T> c) { if (c.empty()) { throw std::domain_error("median of an empty vector"); } // 拷贝容器,避免修改原容器 std::vector<T> temp = c; std::sort(temp.begin(), temp.end()); size_t n = temp.size(); size_t mid = n / 2; if (n % 2 == 0) { // 偶数个,取中间两个数的平均值 return (temp[mid-1] + temp[mid]) / 2.0; } else { // 奇数个,取中间的数 return temp[mid]; } } ``` 使用示例: ```cpp #include <iostream> int main() { std::vector<int> vec1 = {1, 3, 2, 5, 4}; // 奇数个 std::vector<double> vec2 = {1.0, 3.0, 2.0, 5.0}; // 偶数个 std::cout << "Median of vec1: " << median(vec1) << std::endl; // 应该输出3 std::cout << "Median of vec2: " << median(vec2) << std::endl; // 应该输出(2+3)/2=2.5 return 0; } ``` 注意事项: 1. 函数使用了拷贝,如果容器很大,可能会有性能开销。如果允许修改原容器,可以改为传引用并排序原容器,但需要明确说明。 2. 对于整数类型,注意偶数个时除以2.0以确保结果是浮点数。如果希望返回类型与元素类型一致,可以使用更复杂的类型萃取,但这里为了简单返回double。 3. 空容器抛出异常,调用者需要处理。 另外,也可以考虑使用std::nth_element来部分排序以提高性能,特别是当数据量很大且只需要中位数时,因为nth_element可以在线性时间内完成: ```cpp template<typename T> double median_with_nth_element(std::vector<T> c) { if (c.empty()) { throw std::domain_error("median of an empty vector"); } size_t n = c.size(); auto mid = n / 2; std::nth_element(c.begin(), c.begin() + mid, c.end()); // 将中间位置的元素放到正确位置 if (n % 2 == 0) { // 对于偶数,需要找到中间两个数,所以还需要在左半部分找到最大的那个数(即mid-1位置) auto left_mid = std::max_element(c.begin(), c.begin() + mid); return (*left_mid + c[mid]) / 2.0; } else { return c[mid]; } } ``` 但是注意:这种方法虽然平均时间复杂度是线性的(std::nth_element平均为O(n)),但是偶数情况下还需要在左半部分找最大值(O(mid)),所以整体还是O(n)。不过,相比于完全排序的O(n log n),在数据量大时可能有优势。但是,这种方法修改了原容器的顺序(部分排序)。 根据需求选择合适的方法。 引用说明: 在C++标准库中没有专门的median函数,但我们可以用上述方法实现。关于C++标准库的文档可以参考ISO C++标准[^1]。 相关问题: 1. 如何在C++中计算其他分位数(如四分位数)? 2. 有没有第三方库提供了现成的中位数函数? 3. 对于非常大的数据集,如何高效地计算中位数? 4. 在C++中,如何计算一组数据的众数? </think> ### C++ 中位数的实现与使用 在 C++ 标准库中,**没有直接提供名为 `median` 的函数**,但可以通过标准算法库高效实现中位数计算。以下是两种常用方法: --- #### 方法 1:使用 `std::sort`(完整排序) ```cpp #include <algorithm> #include <vector> #include <stdexcept> template<typename T> double median(std::vector<T>& data) { if (data.empty()) { throw std::domain_error("Cannot compute median of empty vector"); } // 排序数据 std::sort(data.begin(), data.end()); size_t n = data.size(); size_t mid = n / 2; if (n % 2 == 0) { // 偶数个元素:中间两数的平均值 return (data[mid-1] + data[mid]) / 2.0; } else { // 奇数个元素:中间值 return data[mid]; } } ``` **示例使用**: ```cpp std::vector<int> values = {5, 2, 9, 1, 7}; double med = median(values); // 返回 5.0 ``` --- #### 方法 2:使用 `std::nth_element`(部分排序,更高效) ```cpp template<typename T> double fast_median(std::vector<T>& data) { if (data.empty()) throw std::domain_error("Empty vector"); size_t n = data.size(); size_t mid = n / 2; // 将中间元素置于正确位置 std::nth_element(data.begin(), data.begin() + mid, data.end()); if (n % 2 != 0) { return data[mid]; } else { // 获取左中位数(需再次部分排序) auto left_mid = std::max_element(data.begin(), data.begin() + mid); return (*left_mid + data[mid]) / 2.0; } } ``` **优势**:时间复杂度为 $O(n)$(平均情况),优于排序的 $O(n \log n)$,适合大数据集。 --- #### 关键注意事项 1. **数据类型支持**: - 模板函数支持 `int`, `float`, `double` 等数值类型。 - 自定义类型需定义比较运算符(如 `operator<`)。 2. **空容器处理**: - 必须检查空容器,否则会引发未定义行为。 3. **性能对比**: | 方法 | 时间复杂度 | 是否修改原数据 | |---------------------|------------------|----------------| | `std::sort` | $O(n \log n)$ | 是 | | `std::nth_element` | $O(n)$ (平均) | 是 | 4. **替代方案**: - **第三方库**:Boost.Math 提供 `boost::math::statistics::median`[^1]。 - **C++20 扩展**:`std::ranges::sort` 可简化代码。 --- ### 相关问题 1. **如何在不修改原数组的情况下计算中位数?** *(提示:使用拷贝或只读算法)* 2. **C++ 中如何高效计算大型数据集的中位数?** *(提示:分治或近似算法)* 3. **中位数计算与异常值处理有何关联?** *(对比均值与中位数的鲁棒性)* 4. **C++ 标准库为何不直接提供 `median()` 函数?** *(讨论设计哲学与泛型编程约束)*
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值