我正在编写一些代码来集成 ODE。这个问题既是对编码建议的请求,也是对解决方案的请求,因此,如果您对我将要提供的建议有替代建议,请告诉我!
ODE 积分器要集成的“对象”以 6 个“块”的形式出现……原因是我有一个双精度的 std::vector,它们按以下方式排列:
前 3 个双精度值是位置坐标;x、y 和 z。接下来的 3 个双精度是速度坐标;x、y 和 z。
所以,现在你知道了,我有一个函数,它接受成对的“位置” “”“向量”“”作为参数并返回某种结果......看看我要去哪里?
目前,该函数需要 2 批位置坐标,方式如下:
std::vector<double> magic_gravity_formula(const std::vector<double> &r1,
const std::vector<double> &r2, const double m1, const double m2)
我不想将 3 组中的所有数据复制到新向量中——这是一种疯狂(而且非常慢)的编程方式。
我可以改为使用指向原始数据的指针......并且只需将指针传递给 x 坐标(3 个双精度块中的第一项) - 这对我来说似乎还可以,但也许有更好的方法?有点像 Python 或 Matlab 数组切片?我可以做这样的事情吗?
我有点想传递一个新的向量(或某种包装类?),从已经存储在数组中的数据创建......有点像
std::vector<double> sub_section_of_data = data[0..2] // Obviously pseudocode!
好的,所以上面的内容是荒谬的,因为可能实现该语法的语言仍然会进行复制操作,这可能很慢 - 这正是我试图避免的......
所以是的,我不确定在这里进行的最佳方式 - 任何人都可以提出一个“好的”解决方案吗?(以非主观方式!)
编辑:要说清楚 - 问题是我不想做类似的事情:
std::vector<double> r1_temp;
r1_temp.push_back(data[0]); // Copy ! Bad !
r1_temp.push_back(data[1]);
r1_temp.push_back(data[2]);
... same for an r2 ...
std::vector<double> force = magic_gravity_formula(r1, r2, m1, m2);
编辑 2:考虑编译器选项 - 编译器是否会通过以下方式更改函数以接受参数来为我优化我的代码:
std::vector<double> super_gravity_formula(double x1, double y1, double z1, double x2, double y2, double z2, double m1, double m2)
在这种情况下,也许这个问题并不重要?(除了形成“让你的代码看起来很好读”的观点。)
编辑3:因此它仍然很重要。