gpt4 book ai didi

c++ - 表达式模板和求和符号

转载 作者:太空宇宙 更新时间:2023-11-04 13:26:34 24 4
gpt4 key购买 nike

我正在为量子力学编写一个小型库,我想使用表达式模板来形成运算符表达式。特别是用表达式模板形成哈密顿量。

我基本上是按照这个源代码构造代码并重载相应的运算符 + * -: https://en.wikipedia.org/wiki/Expression_templates

形成哈密顿量的表达式需要求和

Vec x = u_1 + u_2 + ... + u_N

其中 N 是一个(常量)整数,u_i 也是 Vec 类型。在代码中编写这个表达式是可行的,但我希望能够编写

Vec x = Sum_{i=0}^{N} u_i

如何做到这一点?

------------ 编辑------------

经过一些研究并在评论的帮助下,我想到了静态 for 循环的想法...谷歌搜索后我在 http://www.drdobbs.com/loops-metaloops-c/184401835?pgno=8 中找到了一篇文章这正是我所需要的。

最佳答案

没有办法编写模板或函数来神奇地匹配来自周围范围的变量,因此您的 u_i 语法无法工作。你可以用宏做类似的事情,例如:

#define SUM_4(x) x ## 1 + x ## 2 + x ## 3 + x ## 4

用法:

Vec u_1, u_2, u_3, u_4;
...
Vec x = SUM_4(u_);

您需要为其他数量的源 vector 定义额外的宏。

C++ 中的下标运算符是通过数组访问建模的,例如u[1], u[2], ...。如果您愿意维护一个 Vec 数组,您可以编写一个遍历该数组的通用函数。在这种情况下,参数将是数组。像这样的东西:

template<typename T, int N>
T sum(T (&u)[N])
{
// (or your preferred summation procedure)
T x = u[0];
for (int i=1; i < N; ++i)
x += u[i];
return x;
}

用法:

Vec u[4];
...
Vec x = sum(u);

最好使用 std::vector 或固定大小的数组模板。

附言考虑使用 Eigen .

编辑:更新 sum() 模板,从 http://www.cplusplus.com/articles/D4SGz8AR/ 中扣除数组大小

关于c++ - 表达式模板和求和符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33186538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com