c++ - 在 C++ 中实现一个数学向量,重用标准库的容器
问题描述
这个问题是由以下实现一阶常微分方程 (ODE)积分的龙格库塔公式引起的。
template <typename Field, typename Vector>
auto
runge_kutta(const Vector& y,
std::function<Vector(Field, const Vector&)> rhs,
Field t, Field delta_t)
{
Vector k1 = rhs(t, y);
Vector k2 = rhs(t + delta_t/2, y + delta_t/2*k1);
Vector k3 = rhs(t + delta_t/2, y + delta_t/2*k2);
Vector k4 = rhs(t + delta_t, y + delta_t * k3);
return y + delta_t/6*(k1 + 2*k2 + 2*k3 + k4);
}
这可用于集成如下功能
double f(double t, double y) { return y; }
但是上面的 Runge Kutta 代码也可用于求解具有多个因变量的高阶 ODE 或 ODE。为此,模板参数 Vector 必须是具有适当定义的算术运算符的数字(或不同类型的向量)的容器。
因此,我正在寻找Vector
具有以下属性的类型的实现:
- 类型是数字或不同类型向量的容器。
- 适当地重载运算符
operator+
,operator-
和.operator*
operator/
- 在调用代码中不需要使用这些运算符的 using 声明。
- 标准库被重用。
我想出的最好的方法是std::array
在新的命名空间中创建运算符
namespace StackOverflow {
template<typename Field, typename Element, std::size_t Dim>
auto
operator*(Field lhs, const std::array<Element, Dim>& rhs);
// etc., etc.
}
并在调用代码中有合适的 using 声明(违反上述第 2 点)
using StackOverflow::operator+; ...
另一种可能性是公开地从std::array
. 这是可行的,但据我所知,这是 C++ 语言标准明确禁止的。
是否可以重用std::array
- 保留上面的前四个属性 - 而无需std::array
完全重写?
解决方案
推荐阅读
- java - 如何解决 Java 中的编码问题?
- r - 使用按列分组识别行中的差异
- reactjs - React: Unable to access and test props & state during Jest/Enzyme shallow rendering
- android - set center_horizontal for child of FrameLayout
- google-maps - 用于识别道路阻塞/封闭标志的 Google API
- rabbitmq - rabbitmq 的健康检查
- amazon-ec2 - AWS EC2 - 获取通过 RDP 登录的 AWS EC2 实例的访问日志
- angular - 使用离子 4 找不到角管
- c# - 新的 OLEDB 驱动程序 (MSOLEDBSQL) 无法在 sql server 中存储日期时间 (.fff) 的一小部分
- php - 在 PHP 中使用 MySQL 数据进行搜索和排序