C++ Boost';y=Ax的s线性代数解

C++ Boost';y=Ax的s线性代数解,c++,math,boost,linear-algebra,C++,Math,Boost,Linear Algebra,有吗? 其中A、y和x分别是矩阵(稀疏且可能非常大)和向量。 y或x可以是未知的 我似乎在这里找不到: 线性解算器通常是LAPACK库的一部分,LAPACK库是BLAS库的高级扩展。如果您在Linux上,“英特尔MKL”有一些很好的解算器,针对密集矩阵和稀疏矩阵进行了优化。如果您使用windows,MKL将免费试用一个月。。。老实说,其他的我都没试过。我知道Atlas软件包有一个免费的LAPACK实现,但不确定在windows上运行有多困难 无论如何,在您的系统上搜索一个LAPACK库。阅读bo

有吗? 其中A、y和x分别是矩阵(稀疏且可能非常大)和向量。 y或x可以是未知的

我似乎在这里找不到:
线性解算器通常是LAPACK库的一部分,LAPACK库是BLAS库的高级扩展。如果您在Linux上,“英特尔MKL”有一些很好的解算器,针对密集矩阵和稀疏矩阵进行了优化。如果您使用windows,MKL将免费试用一个月。。。老实说,其他的我都没试过。我知道Atlas软件包有一个免费的LAPACK实现,但不确定在windows上运行有多困难


无论如何,在您的系统上搜索一个LAPACK库。

阅读boost文档,它看起来不像是实现了解决w.r.t x。在y中求解只是矩阵向量积的问题,它似乎在ublas中实现


需要记住的一点是,blas只实现“简单”的运算,如加法、乘法等。。。向量和矩阵类型。任何更高级的东西(线性问题解决,比如你的“解x y=A x”,特征向量和co)都是LAPACK的一部分,它建立在BLAS之上。我不知道boost在这方面提供了什么。

boost的线性代数包的调整集中在“密集矩阵”上。 据我所知,Boost的软件包没有任何线性系统解算器。 在“C()中的数字配方”中使用源代码怎么样


注意。源代码中可能存在细微的索引错误(有些代码使用数组索引从1开始)

请查看。我只对非稀疏矩阵使用过它(您可能需要QR或LU分解,这两种分解都有解算器实用程序方法),但它显然对稀疏矩阵有一些功能

当A稀疏时,Ax=b的最佳解算器之一是Tim Davis的解算器

UMFPACK
计算a的稀疏LU分解。该算法 在Matlab中键入
x=A\b
(且A是稀疏的)时在后台使用 和正方形)<代码>UMFPACK是自由软件(GPL)


还要注意,如果y=Ax,x是已知的,但y不是已知的,则通过执行稀疏矩阵向量乘法而不是求解线性系统来计算y

是的,您可以使用boost的ublas库求解线性方程组。下面是一种使用LU因子分解和反向代换得到逆矩阵的简单方法:

using namespace boost::ublas;

Ainv = identity_matrix<float>(A.size1());
permutation_matrix<size_t> pm(A.size1());
lu_factorize(A,pm)
lu_substitute(A, pm, Ainv);
使用名称空间boost::ublas;
Ainv=单位矩阵(A.size1());
置换矩阵pm(A.size1());
lu_分解(A,pm)
lu_替代品(A、pm、Ainv);

因此,为了解线性系统AX= Y,你将通过反(A(A))^ 1的逆解得到X(x)=(反(A)A)^ -1Ay。< /P>求方程反(A)AX=Trn(a)y,因为我对Boost或C++一无所知,我只想说当A和A是可逆矩阵时,也有一个解。如果A是不可逆的,那么最小二乘解x=(A^T A)^(-1)A^T y是最接近的。这通常不是矩阵方程的求解方式(对于数值稳定性和速度来说,逆通常都不好),相反,你会看到QR或LU分解,然后是反向替换。这不是一个bug,这是一个特性!这是为了使算法更适合Fortran用户。注意:LAPACK不是稀疏解算器,因此它不能非常有效地存储稀疏矩阵,也不能特别有效地求解稀疏系统。“英特尔MKL”确实包含稀疏解算器(),特别是PARDISO直接稀疏解算器()。密集型和稀疏型数值线性代数软件的良好概述可以在the it’s上找到,并且除非您正在构建一个商业产品,否则我建议您放弃MKL库,而只是获得PARDISO,这样您就可以节省资金并避免处理许可证问题。如果您所需要的只是Ax=y的解决方案,只需使用置换矩阵pm(A.size1());lu_分解(A,pm);LUU替代品(A、pm、y)和
y
被替换为解。这不是x的方程吗<代码>x=(事务处理(A)*A)^-1*事务处理(A)*y