表达式模板和求和符号

Expression template and summation symbol

本文关键字:求和 符号 表达式      更新时间:2023-10-16

我在写一个量子力学的小库,我想用表达式模板来形成算子表达式。特别是用表达式模板构造哈密顿函数。

我基本上遵循这个源代码来构造代码并重载相应的操作符+ * -:https://en.wikipedia.org/wiki/Expression_templates

生成哈密顿函数表达式需要一个和

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

,其中N是一个(const)整数,u_i也属于Vec类型。在代码中编写此表达式工作,但我希望能够编写

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

怎么做呢?

------------ EDIT ------------

在一些研究和注释的帮助下,我想出了一个静态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_);

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

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/