Система решения Ax = b линейным методом наименьших квадратов со сложными элементами и матрицей A нижнего треугольника

Я хотел бы решить линейную систему Ax = b линейным методом наименьших квадратов, получая тем самым x, Матрицы A, x а также b содержат элементы, которые являются комплексными числами.

матрица A имеет размеры n от n, а также A квадратная матрица, которая также является нижней треугольной векторы b а также x иметь длину n, В этой системе столько же неизвестных, сколько и уравнений, но так как b это вектор, заполненный фактическими измеренными «данными», я подозреваю, что было бы лучше сделать это линейным методом наименьших квадратов.

Я ищу алгоритм, который будет эффективно решать эту систему в стиле LLS, используя, возможно, разреженную матрицу структуры данных для нижней треугольной матрицы A,

Возможно, уже есть библиотека C / C ++ с таким алгоритмом? (Я подозреваю, что лучше использовать библиотеку из-за оптимизированного кода.) Оглядываясь в библиотеке собственных матриц, можно обнаружить, что декомпозиция SVD может использоваться для решения системы уравнений в режиме LLS (ссылка на документацию Eigen). Однако как мне работать с комплексными числами в Eigen?

Похоже, что библиотека Eigen работает с SVD, а затем использует это для решения LLS.


Вот фрагмент кода, демонстрирующий, что я хотел бы сделать:

#include <iostream>
#include <Eigen/Dense>
#include <complex>

using namespace Eigen;

int main()

{

// I would like to assign complex numbers
// to A and b

/*
MatrixXcd A(4, 4);
A(0,0) = std::complex(3,5);     // Compiler error occurs here
A(1,0) = std::complex(4,4);
A(1,1) = std::complex(5,3);
A(2,0) = std::complex(2,2);
A(2,1) = std::complex(3,3);
A(2,2) = std::complex(4,4);
A(3,0) = std::complex(5,3);
A(3,1) = std::complex(2,4);
A(3,2) = std::complex(4,3);
A(3,3) = std::complex(2,4);
*/

// The following code is taken from:
// http://eigen.tuxfamily.org/dox/TutorialLinearAlgebra.html#TutorialLinAlgLeastsquares

// This is what I want to do, but with complex numbers
// and with A as lower triangular

MatrixXf A = MatrixXf::Random(3, 3);
std::cout << "Here is the matrix A:\n" << A << std::endl;
VectorXf b = VectorXf::Random(3);
std::cout << "Here is the right hand side b:\n" << b << std::endl;
std::cout << "The least-squares solution is:\n"<< A.jacobiSvd(ComputeThinU | ComputeThinV).solve(b) << std::endl;
}// end

Вот ошибка компилятора:

 error: missing template arguments before '(' token

ОБНОВИТЬ

Вот обновленная программа, показывающая, как бороться с решением LLS с использованием Eigen. Этот код действительно компилируется правильно.

#include <iostream>

#include <Eigen/Dense>

#include <complex>using namespace Eigen;int main()

{

MatrixXcd A(4, 4);
A(0,0) = std::complex<double>(3,5);
A(1,0) = std::complex<double>(4,4);
A(1,1) = std::complex<double>(5,3);
A(2,0) = std::complex<double>(2,2);
A(2,1) = std::complex<double>(3,3);
A(2,2) = std::complex<double>(4,4);
A(3,0) = std::complex<double>(5,3);
A(3,1) = std::complex<double>(2,4);
A(3,2) = std::complex<double>(4,3);
A(3,3) = std::complex<double>(2,4);

VectorXcd b(4);
b(0) = std::complex<double>(3,5);
b(1) = std::complex<double>(2,0);
b(2) = std::complex<double>(8,2);
b(3) = std::complex<double>(4,8);

std::cout << "Here is the A matrix:" << std::endl;
std::cout << A << std::endl;

std::cout << "Here is the b vector:" << std::endl;
std::cout << b << std::endl;

std::cout << "The least-squares solution is:\n"
<< A.jacobiSvd(ComputeThinU | ComputeThinV).solve(b) << std::endl;}// end

0

Решение

поскольку std::complex класс шаблона, и вы начинаете с std::complex(1,1); компилятор не знает, что это за тип.

использование std::complex<double>(1, 1); вместо.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]