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

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

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

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

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

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

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

#include 
#include 
#include 

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

Ответы на вопрос(1)

Ваш ответ на вопрос