尝试将元素插入初始未指定大小的矩阵中时发生运行时错误。
以下代码在finr上为m1运行,但对 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;
}
如果有人可以提供替代方法来实现这一目标,我将不胜感激。
最佳答案
如您所知,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;
}
Online demo
希望能有所帮助。