表达式模板和求和符号
Expression template and summation symbol
我在写一个量子力学的小库,我想用表达式模板来形成算子表达式。特别是用表达式模板构造哈密顿函数。
我基本上遵循这个源代码来构造代码并重载相应的操作符+ * -: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/
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- VC++本机单元测试,找不到调试符号
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 检查TCHAR数组输入是否为带符号整数C++
- 用符号版本替换对函数的所有调用
- 未解析的外部符号_MsiLocateComponentW@12.
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 水平求和SSE无符号字节矢量的最快方法
- 表达式模板和求和符号