如何将欧拉法实现从std::vector<float>改为普通float数组?
欧拉公式实现从std::vector到普通float数组的重构
我有一个用于函数估计的欧拉公式实现,当前采用std::vector<float>类型存储数组,但后续代码要求传入的参数为普通float数组,希望重构此处代码。dydt为现有公式实现的函数
原代码:
void euler(float y0, float a, int n, float dt, std::vector<float>& t, std::vector<float>& y) { double y_init = y0; double t_init = 0.0; for (int i = 0; i <= n; i++) { t.push_back(t_init); y.push_back(y_init); double y_p = dydt(y_init, a); y_init = y_init + dt * y_p; t_init = t_init + dt; } }
要求修改为如下函数签名:
void euler(float y0, float a, int n, float dt, float t[n], float y[n])
我目前在普通数组的for循环逻辑上遇到瓶颈,虽然vector在此场景下更易用,但后续函数要求必须使用普通float数组。
重构后的代码实现
void euler(float y0, float a, int n, float dt, float t[n], float y[n]) { double y_init = y0; double t_init = 0.0; // 直接通过数组下标赋值,替代vector的push_back操作 for (int i = 0; i <= n; i++) { // 将高精度中间值转换为float存入数组 t[i] = static_cast<float>(t_init); y[i] = static_cast<float>(y_init); double y_p = dydt(y_init, a); y_init = y_init + dt * y_p; t_init = t_init + dt; } }
关键修改点说明
- 替换
push_back为数组下标赋值:普通数组不支持动态扩容,直接通过t[i]和y[i]将计算结果存入对应位置即可 - 保留高精度计算逻辑:继续用
double类型存储中间变量y_init和t_init,最后转换为float存入数组,和原代码的精度表现一致 - 循环逻辑完全对齐:保持
i <= n的循环条件,确保生成n+1个数据点,和原vector版本的输出数量一致 - 注意数组容量:调用该函数时,传入的数组必须能容纳至少
n+1个float元素,否则会触发数组越界行为
内容的提问来源于stack exchange,提问作者Borys Ostapienko
相关产品推荐
相关产品推荐

