C ++ Адаптивная и только заголовок библиотека алгоритмов Lanczos
Lambda Lanczos вычисляет наименьшее или самое большое собственное значение и соответствующий собственный вектор симметричной (эрмитовой) матрицы.
Характерной особенностью является подпрограмма умножения матрицы-вектор, используемая в алгоритме Lanczos, адаптируется:
#include <lambda_lanczos/lambda_lanczos.hpp> Использование lambda_lanczos :: lambdalanczos;/ * Некоторые включают и используют объявления пропущены */void sample () {const int n = 3; двойная матрица [n] [n] = {{2.0, 1.0, 1.0}, {1.0, 2,0, 1,0}, {1.0, 1.0, 2.0}}; // его собственные значения - {4, 1, 1} / * Подготовьте матричную рутину умножения, используемой в алгоритме Lanczos */ Auto mv_mul = [&] (const vector <double> & in, vector <wod> & out) {for (int i = 0; i <n; i ++) {for (int j = 0; j <n; j ++) { out [i] += matrix [i] [j]*в [j]; } } }; / * Выполнить алгоритм Lanczos */ Lambdalanczos <Double> двигатель (mv_mul, n, true, 1); // Найти 1 максимальное собственное значение вектор <двойной> собственные значения; вектор <вектор <двойной >> собственные векторы; Engine.Run (собственные значения, собственные векторы); //// Если C ++ 17 доступен, следующая нотация делает то же самое: // Auto [собственные значения, собственные векторы] = Engine.Run () / * Результат печати */ cout << "собственное значение:" << setPrecision (16) << собственные значения [0] << endl; cout << "собственное вектор:"; для (int i = 0; i <n; i ++) { cout << собственные векторы [0] [i] << ""; } cout << endl; }
Эта функция позволяет вам
Легко объединить Lambda Lanczos с существующими библиотеками матрицы (например, собственное значение; см. Пример кода).
Используйте матрицу, элементы которых приведены частично, например, разреженная матрица, чьи ненулевые элементы хранятся в виде списка {row-index, column-index, value}.
Lambda Lanczos предоставляет следующие два интерфейса:
Класс LambdaLanczos
вычисляет максимальные (минимальные) собственные значения и соответствующие собственные векторы. Вырожденные собственные значения принимаются во внимание. Этот класс нацелен на проблемы, которые требуют одной или нескольких собственных партий (например, низкоэнергетическое возбуждение квантовой системы).
Класс Exponentiator
вычисляет следующий тип умножения матрицы-вектора:
где
В качестве приложения этот класс может быть использован для эволюции времени квантовой системы многих тел:
и более сложные алгоритмы, такие как TDVP и другие тензорные сети.
Смотрите здесь.
Ссылка на API
C ++ 11 Совместимая среда
Lambda Lanczos сам не зависит от каких -либо библиотек.
Чтобы запустить тесты, требуется тест Google.
Lambda Lanczos -это библиотека только для заголовка. Итак, шаг установки выглядит следующим образом:
Клонировать или скачать последнюю версию от Github.
Поместите каталог include/lambda_lanczos
в любом месте, где может найти ваш проект.
Грань
MRCDR