2

尝试在最初未指定大小的矩阵中插入元素时出现运行时错误。

下面的代码为 m1 运行 finr 但为m2抛出错误。

#include <iostream>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>    

int main () {
    boost::numeric::ublas::matrix<double> m1 (1,1);
    boost::numeric::ublas::matrix<double> m2;
    unsigned int i = 0;
    m1(i,i)=9;  // This works completely
    m2(i,i)=9;  // This one throws error
    return 0;
}

如果有人可以提供替代方案来实现这一目标,我将不胜感激。

4

1 回答 1

3

正如您自己注意到的那样,boost::numeric::ublas::matrix它不会自动调整自身大小,例如std::vector. 您必须在调用之前手动调整大小operator(),或者编写一个为您调整大小的函数模板,如下所示:

namespace ublas = boost::numeric::ublas; //just a friendly alias!

template<typename T, typename U>
void assign(ublas::matrix<T>& m,std::size_t r,std::size_t c,U const& data)
{
    m.resize(std::max(m.size1(), r+1), std::max(m.size2(), c+1));
    m(r, c) = data;
}

现在你可以这样做:

int main () 
{
    ublas::matrix<double> m;

    assign(m, 0, 0, 9);  //m(0,0) = 9; 
    assign(m, 3, 2, 20); //m(3,2) = 20

    std::cout << m << std::endl; //prints: [4,3]((9,0,0),(0,0,0),(0,0,0),(0,0,20))
    return 0;
}

在线演示

希望有帮助。

于 2015-01-08T12:57:47.970 回答