std::inner_product与std::accumulate初始值设置踩坑

2023-05-16

std::inner_product函数可以用于计算两个序列的内积。在这个函数中,我们需要传递四个参数:两个源序列的起始迭代器、一个初始值和一个二元函数对象。

std::inner_product函数将对两个源序列中的每个元素进行乘法运算,并将结果累加到初始值中,最终返回累加结果。

以下是一个示例代码,演示了如何使用std::inner_product函数计算两个序列的内积:

#include <iostream>
#include <vector>
#include <numeric>

double calc_confi_interval(double rtt_interval_ratio) {
    return 1.96 * rtt_interval_ratio / std::sqrt(2);
}

int main() {
    std::vector<double> rtt_interval_ratios = {0.5, 0.6, 0.7, 0.8, 0.9};
    std::vector<double> rtt_interval_weights = {0.1, 0.2, 0.3, 0.4, 0.5};
    std::vector<double> rtt_interval_confidences(rtt_interval_ratios.size());
    int N_intervals = 3;
    std::transform(rtt_interval_ratios.begin(), rtt_interval_ratios.begin() + N_intervals,
                   rtt_interval_confidences.begin(), calc_confi_interval);
    double res = std::inner_product(rtt_interval_confidences.begin(), rtt_interval_confidences.begin() + N_intervals,
                                    rtt_interval_weights.begin(), 0.0);
    std::cout << res << std::endl;
    return 0;
}

在这个示例代码中,我们定义了一个函数calc_confi_interval,用于计算置信区间。我们还定义了两个序列rtt_interval_ratiosrtt_interval_weights,分别表示RTT间隔比率和权重。我们使用std::transform函数将rtt_interval_ratios序列中的前N_intervals个元素转换为置信区间,并将结果存储到rtt_interval_confidences序列中。最后,我们使用std::inner_product函数计算rtt_interval_confidences序列和rtt_interval_weights序列的内积,并将结果存储到res变量中。

通过使用std::inner_product函数,我们可以方便地计算两个序列的内积。在二元函数对象中,我们可以根据需要定义不同的运算规则,以便满足不同的计算需求。

std::inner_product函数的初始值对于结果类型有影响,初始值的类型必须与源序列和二元函数对象的返回类型相同,否则计算可能会有精度丢失。

以下是一个示例代码,演示了初始值类型与结果类型不匹配时会导致结果出错:

int main() {
    std::vector<int> v1 = {1, 2, 3};
    std::vector<double> v2 = {1.1, 2.2, 3.3};
    auto res = std::inner_product(v1.begin(), v1.end(), v2.begin(), 0);
    std::cout << res << std::endl;
    return 0;
}

在这里插入图片描述
初始值改为0.0

int main() {
    std::vector<int> v1 = {1, 2, 3};
    std::vector<double> v2 = {1.1, 2.2, 3.3};
    auto res = std::inner_product(v1.begin(), v1.end(), v2.begin(), 0.0);
    std::cout << res << std::endl;
    return 0;
}

在这里插入图片描述
计算结果也正确了。
与之类似的例如std::accumulate

int main() {
    std::vector<double> v = {1.1, 2.2, 3.3, 4.4, 5.5};
    auto sum = std::accumulate(v.begin(), v.end(), 0);
    std::cout << "sum = " << sum << std::endl;
    return 0;
}

在这里插入图片描述
计算结果为15,明显丢失精度了。
初始值改为0.0

int main() {
    std::vector<double> v = {1.1, 2.2, 3.3, 4.4, 5.5};
    auto sum = std::accumulate(v.begin(), v.end(), 0.0);
    std::cout << "sum = " << sum << std::endl;
    return 0;
}

在这里插入图片描述
结果为16.5,正确。
其他也有一些函数有初始值的坑,这里简单提及一下即可:
std::transform_reduce函数:在计算序列的变换和缩减时,初始值的类型应该与变换和缩减函数的返回类型相同,否则可能会导致类型转换错误或精度损失。

std::partial_sum函数:在计算序列的部分和时,初始值的类型应该与序列的元素类型相同,否则可能会导致类型转换错误或精度损失。

std::reduce函数:在计算序列的缩减时,初始值的类型应该与缩减函数的返回类型相同,否则可能会导致类型转换错误或精度损失。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::inner_product与std::accumulate初始值设置踩坑 的相关文章

随机推荐

  • c++判断文件是否存在

    可以使用C 43 43 的文件流来判断文件是否存在 以下是一个简单的函数 xff0c 可以通过文件名判断文件是否存在 xff1a span class token macro property span class token direct
  • 相机内外参数的意义

    1 内参数 xff1a 由于相机坐标系使用的是毫米制的单位 xff0c 而图像平面使用的像素为单位 内参数的作用就是在这两个坐标系之间进行线性的变化 相机光轴中心Z轴方向与像平面交点称为投影中心 xff0c 其坐标为 xff0c 其单位为像
  • C++实现读写分离的双缓冲buffer

    目录 1 双缓冲区 读写分离2 后台线程定时更新数据3 类设计完整代码cache cppcache hmain cppmakefile 读写分离的双缓冲buffer有以下好处 xff1a 提高了并发读写的效率 xff1a 在多线程环境下 x
  • 返回引用与返回值与返回std::move(obj)

    返回引用与返回值相比 返回引用与返回值相比有以下几个好处 xff1a 减少内存开销 xff1a 返回值需要在函数内部创建一个临时对象 xff0c 然后将该对象的副本返回给调用者 这个过程需要分配内存 复制数据等操作 xff0c 会增加内存开
  • error: non-member function ‘XXX::IsValid(const T&)’ cannot have cv-qualifier

    这个错误提示表明你定义的函数 IsValid 是一个非成员函数 xff0c 并且带有 const 限定符 在 C 43 43 中 xff0c 非成员函数不能带有 const 限定符 xff0c 因为它们没有隐式的 this 指针 xff0c
  • c++使用regex报错regex_error

    原本写了个同时识别IPv4和IPv6地址的C 43 43 函数 xff1a span class token macro property span class token directive hash span span class to
  • c++实现日志类(写入logfile)

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • c++中以类对象作为key用于unordered_map、map,以及std::tie技巧使用

    我有一个类 span class token keyword class span span class token class name UserRegion span span class token punctuation span
  • std::set_difference用法

    std set difference 是 C 43 43 STL 中的一个算法 xff0c 用于计算两个有序范围之间的差集 xff0c 并将结果存储到另一个有序范围中 std set difference 的函数签名如下 xff1a spa
  • __builtin_xxx指令学习【1】__builtin_expect

    builtin expect是GCC编译器提供的一个内置函数 xff0c 用于告诉编译器一个分支的执行概率 xff0c 以便编译器在生成机器码时进行优化 它的语法如下 xff1a span class token function buil
  • __builtin_xxx指令学习【2】__builtin_prefetch

    builtin prefetch是GCC编译器提供的一个内置函数 xff0c 用于预取数据到CPU的缓存中 xff0c 以便提高程序的执行效率 它的语法如下 xff1a builtin prefetch const void addr in
  • __builtin_xxx指令学习【3】__builtin_popcount & __builtin_popcountll

    builtin popcount是GCC和Clang编译器提供的一个内置函数 xff0c 用于计算一个整数中二进制位为1的个数 该函数的使用背景是在一些位运算和计算机视觉等领域中 xff0c 需要对二进制数据进行处理和分析 xff0c 而二
  • 当arduino遇到树莓派(usb串口)

    arduino与树莓派cm4通过usb串口连接 xff1a 问题描述 前两天尝试了很久arduino和树莓派连接 终于找到了连接的方法 xff01 可恶 这是在简书找到的过程 主要是先在树莓派端导serial包 pip install se
  • Linux的rc.local自启动服务

    Linux的rc local自启动服务 网址 xff1a http blog csdn net 21aspnet article details 6826659 Linux有自己一套完整的启动体系 xff0c 抓住了linux启动的脉络 x
  • __builtin_xxx指令学习【4】__builtin_clz&__builtin_ctz & __builtin_clzll & __builtin_ctzll

    builtin clz是GCC和Clang编译器提供的一个内置函数 xff0c 用于计算一个整数的二进制表示中 xff0c 从最高位开始连续的0的个数 该函数的使用背景是在一些位运算和计算机视觉等领域中 xff0c 需要对二进制数据进行处理
  • __builtin_xxx指令学习【5】__builtin_bswap16/32/64

    builtin bswap16 32 64是GCC和Clang编译器提供的内置函数 xff0c 用于交换一个整数的字节顺序 其中 xff0c builtin bswap16用于交换一个16位整数的字节顺序 xff0c builtin bsw
  • 【Python】@cache装饰器使用 (依赖cachetools)

    介绍 cachetools 是一个 Python 缓存库 xff0c 可以用于缓存函数的计算结果 xff0c 以提高程序的性能和响应速度 使用 cachetools 可以避免重复计算 减少网络请求 降低数据库负载等问题 xff0c 从而提高
  • Python常见装饰器使用(实用向)

    目录 1 96 64 staticmethod 96 2 96 64 classmethod 96 3 96 64 classmethod 96 与 96 64 staticmethod 96 比较4 96 64 property 96 5
  • 【C++】std::transform、std::back_inserter使用

    std transform函数可以用于对一个序列中的每个元素进行转换 xff0c 并将结果存储到另一个序列中 们需要传递三个参数 xff1a 源序列的起始迭代器 源序列的结束迭代器和目标序列的起始迭代器 此外 xff0c 我们还需要传递一个
  • std::inner_product与std::accumulate初始值设置踩坑

    std inner product函数可以用于计算两个序列的内积 在这个函数中 xff0c 我们需要传递四个参数 xff1a 两个源序列的起始迭代器 一个初始值和一个二元函数对象 std inner product函数将对两个源序列中的每个