以线性最小二乘方式求解系统 Ax=b,具有复元素和下三角形平方 A 矩阵



我想以线性最小二乘法求解线性系统Ax = b,从而获得x。 矩阵Axb包含复数元素。

矩阵A的维数为nnA是一个正方形矩阵,也是下三角形的。向量bx的长度为n。 在这个系统中,有多少方程,就有多少未知数,但是由于b是一个充满实际测量"数据"的向量,我怀疑最好以线性最小二乘方式执行此操作。

我正在寻找一种算法,该算法将以LLS方式有效地解决该系统,可能使用稀疏矩阵数据结构进行下三角矩阵A

也许已经有一个带有这种算法的 C/C++ 库? (由于优化的代码,我怀疑最好使用库。 环顾特征矩阵库,似乎SVD分解可用于以LLS方式求解方程组(链接到特征文档)。 但是,如何在特征中处理复数?

看起来特征库与 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求解。 此代码确实可以正确编译。

#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

由于std::complex是一个模板类,并且您使用std::complex(1,1);初始化编译器不知道它是什么类型。

请改用std::complex<double>(1, 1);

相关内容

  • 没有找到相关文章

最新更新