Boost中的矩阵求逆

6

我正在尝试使用boost进行简单的矩阵求逆操作,但是遇到了错误。我想要找到的是inversted_matrix = inverse(trans(matrix) * matrix),但是出现了错误。

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) 

My attempt:

#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; 
} 

1
这个链接是否有帮助? - awesoon
3个回答

7
Boost Ublas拥有运行时检查功能,以确保数值稳定性等。如果您查看错误源代码,您可以看到它尝试确保U*X = B,X = U ^ -1 * B,U*X = B(或类似的东西)在某个epsilon内是正确的。 如果数值偏差过大,则可能不成立。
您可以通过-DBOOST_UBLAS_NDEBUG禁用检查,或微调BOOST_UBLAS_TYPE_CHECK_EPSILON,BOOST_UBLAS_TYPE_CHECK_MIN。

5

由于m只有4行,因此prod(trans(m), m)的秩不能超过4,并且由于乘积是一个5x5矩阵,它必须是奇异的(即它的行列式为0),计算奇异矩阵的逆就像除以0一样。添加独立的行到m中可以解决这个奇异性问题。


0

我认为你的矩阵维度是4乘5,导致了错误。就像Maarten Hilferink提到的那样,你可以尝试使用一个5乘5的方阵。以下是具有逆矩阵的要求

  1. 矩阵必须是方阵(行数和列数相同)。
  2. 矩阵的行列式不能为零(行列式在第6.4节中介绍)。这是为了拥有逆矩阵,行列式不能为零,而不是实数不能为零。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接