2015-10-17 7 views
1

Я пишу небольшую библиотеку для квантовой механики, и я хочу использовать шаблон выражения для формирования операторных выражений. Особенно это касается гамильтониана с шаблоном выражения.Шаблон выражения и символ суммирования

Я в основном следовал этому источнику, чтобы построить код и перегрузки соответствующих операторов + * -: https://en.wikipedia.org/wiki/Expression_templates

Формовочных выражения для гамильтониана требует суммы

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

, где Н представляет собой (Const) integer и u_i также имеют тип Vec. Написание этого выражения в коде работает, но я хотел был бы иметь возможность написать

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

Как это сделать?

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

После некоторых исследований и с помощью комментариев, я пришел с идеей статического цикла ... После поиска в Интернете я нашел статью в http://www.drdobbs.com/loops-metaloops-c/184401835?pgno=8, которая именно то, что мне нужно.

+0

вы спрашиваете, как написать функцию для выполнения суммы, используя свои выражения? –

+0

Да, это точно мой вопрос. – user2460530

+0

Итак, задайте вопрос. Это сайт вопросов и ответов. – juanchopanza

ответ

0

Невозможно написать шаблон или функцию, которые волшебным образом сопоставляют переменные из окружения, поэтому синтаксис 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 или фиксированный массив размера.

P.S. Рассмотрите возможность использования Eigen.

EDIT: Обновленный sum() шаблона массив размера вычет из http://www.cplusplus.com/articles/D4SGz8AR/

+0

Почему бы не дать компилятору вывести N? –

+0

@MarkGlisse, потому что я не знал, как это сделать. Но теперь я это делаю. Исправлена. –

+0

Большое спасибо за ваш ответ. Хотя я не совсем понял. В предлагаемом вами способе суммировать, так как тип T является Vec, тогда оператор + = должен возвращать что-то вроде VecAdd , не так ли? (см. https://en.wikipedia.org/wiki/Expression_templates). Поэтому я понимаю, что такие операции, как x + = u [i]; не возможны? – user2460530

 Смежные вопросы

  • Нет связанных вопросов^_^