C++ boost中的矩阵求逆

C++ boost中的矩阵求逆,c++,boost,C++,Boost,我试图用boost做一个简单的矩阵求逆运算。但我 我出错了。 基本上我想找到的是逆矩阵= 逆(反(矩阵)*矩阵) 但是我犯了个错误 Check failed in file boost_1_53_0/boost/numeric/ublas/lu.hpp at line 299: detail::expression_type_check (prod (triangular_adaptor<const_matrix_type, upper> (m), e), cm2) termi

我试图用boost做一个简单的矩阵求逆运算。但我 我出错了。 基本上我想找到的是逆矩阵= 逆(反(矩阵)*矩阵) 但是我犯了个错误

Check failed in file boost_1_53_0/boost/numeric/ublas/lu.hpp at line 299: 
detail::expression_type_check (prod (triangular_adaptor<const_matrix_type, 
upper> (m), e), cm2) 
terminate called after throwing an instance of 
'boost::numeric::ublas::internal_logic' 
  what(): internal logic 
Aborted (core dumped) 
第299行的文件boost_1_53_0/boost/numeric/ublas/lu.hpp中的检查失败:
细节::表达式类型检查(产品(三角形适配器(m),e),cm2)
在抛出的实例后调用terminate
'boost::numeric::ublas::内部逻辑'
什么():内部逻辑
中止(堆芯转储)
我的尝试:

#include <boost/numeric/ublas/matrix.hpp> 
#include <boost/numeric/ublas/vector.hpp> 
#include <boost/numeric/ublas/io.hpp> 
#include <boost/numeric/ublas/vector_proxy.hpp> 
#include <boost/numeric/ublas/matrix.hpp> 
#include <boost/numeric/ublas/triangular.hpp> 
#include <boost/numeric/ublas/lu.hpp> 

namespace ublas = boost::numeric::ublas; 
template<class T> 
bool InvertMatrix (const ublas::matrix<T>& input, ublas::matrix<T>& inverse) { 
    using namespace boost::numeric::ublas; 
    typedef permutation_matrix<std::size_t> pmatrix; 
    // create a working copy of the input 
    matrix<T> A(input); 
    // create a permutation matrix for the LU-factorization 
    pmatrix pm(A.size1()); 
    // perform LU-factorization 
    int res = lu_factorize(A,pm); 
    if( res != 0 )
        return false; 
    // create identity matrix of "inverse" 
    inverse.assign(ublas::identity_matrix<T>(A.size1())); 
    // backsubstitute to get the inverse 
    lu_substitute(A, pm, inverse); 
    return true; 
}

int main(){ 
    using namespace boost::numeric::ublas; 
    matrix<double> m(4,5); 
    vector<double> v(4); 
    vector<double> thetas; 
    m(0,0) = 1; m(0,1) = 2104; m(0,2) = 5; m(0,3) = 1;m(0,4) = 45; 
    m(1,0) = 1; m(1,1) = 1416; m(1,2) = 3; m(1,3) = 2;m(1,4) = 40; 
    m(2,0) = 1; m(2,1) = 1534; m(2,2) = 3; m(2,3) = 2;m(2,4) = 30; 
    m(3,0) = 1; m(3,1) = 852; m(3,2) = 2; m(3,3) = 1;m(3,4) = 36; 
    std::cout<<m<<std::endl; 
    matrix<double> product = prod(trans(m), m); 
    std::cout<<product<<std::endl; 
    matrix<double> inversion(5,5); 
    bool inverted; 
    inverted = InvertMatrix(product, inversion); 
    std::cout << inversion << std::endl; 
} 
#包括
#包括
#包括
#包括
#包括
#包括
#包括
名称空间ublas=boost::numeric::ublas;
模板
布尔逆矩阵(常数ublas::矩阵与输入,ublas::矩阵与逆){
使用名称空间boost::numeric::ublas;
typedef置换矩阵pmatrix;
//创建输入的工作副本
矩阵A(输入);
//为LU分解创建置换矩阵
pmatrix pm(A.尺寸1());
//执行LU分解
int res=lu_分解(A,pm);
如果(res!=0)
返回false;
//创建“逆”的单位矩阵
赋值(ublas::identity_矩阵(A.size1());
//反置换得到相反的结果
lu_代换(A,pm,逆);
返回true;
}
int main(){
使用名称空间boost::numeric::ublas;
矩阵m(4,5);
向量v(4);
向量θ;
m(0,0)=1;m(0,1)=2104;m(0,2)=5;m(0,3)=1;m(0,4)=45;
m(1,0)=1;m(1,1)=1416;m(1,2)=3;m(1,3)=2;m(1,4)=40;
m(2,0)=1;m(2,1)=1534;m(2,2)=3;m(2,3)=2;m(2,4)=30;
m(3,0)=1;m(3,1)=852;m(3,2)=2;m(3,3)=1;m(3,4)=36;

boostublas具有运行时检查,以确保数值稳定性。 若您查看错误的来源,您可以看到它试图确保
U*X=B,X=U^-1*B,U*X=B
(或类似的smth)在某个ε范围内。如果在数值上有太多偏差,这可能不成立


您可以通过
-DBOOST\u UBLAS\u NDEBUG
禁用检查,或使用
BOOST\u UBLAS\u TYPE\u CHECK\u EPSILON、BOOST\u UBLAS\u TYPE\u CHECK\u MIN
禁用检查,因为
m
只有4行,
prod(trans(m),m)
的秩不能高于4,并且由于产品是5x5矩阵,它必须是单数(即它有行列式0)计算奇异矩阵的逆就像除以0。在
m
中添加独立的行来解决这个奇异性问题。

会有帮助吗?