来自std :: vector <int> </int>的arma :: rowvec

时间:2012-02-14 12:29:48

标签: c++ std armadillo

我有一个std :: vector,我想将它转换为arma :: rowvec

我做完了:

vector<int> x = foo();
rowvec a;

vector<int>::const_iterator iter2;
int j = 0;
for(iter2 = x.begin(); iter2 != x.end(); ++iter2) {
    a(j++,0) =  *iter2; 
}
a.print("a");

但我明白了:

error: Mat::operator(): out of bounds

terminate called after throwing an instance of 'std::logic_error'
  what():  

如果我在最后的rowvec中使用a(j++,0) = *iter2;而不是a << *iter2;,那么我只获得最后一个元素。

4 个答案:

答案 0 :(得分:8)

最新版本的Armadillo能够直接从std :: vector的实例构建矩阵/矢量对象。

例如:

std::vector<double> X(5);

// ... process X ...

arma::vec Y(X);
arma::mat M(X);

答案 1 :(得分:7)

您忘了设置行向量的大小。

更正确的代码是:

vector<int> x = foo();
rowvec a(x.size());
... rest of your code ...

还可以通过conv_to函数将std :: vector转换为Armadillo矩阵或向量。因此,您可以执行以下操作,而不是手动循环:

vector<int> x = foo();
rowvec a = conv_to<rowvec>::from(x);

请注意, rowvec Row&lt; double&gt; 的同义词。请参阅Row类的文档。因此,在两个代码示例中,还发生 int double 转换。如果您不想这样,您可能希望使用 irowvec

答案 2 :(得分:2)

使用带有aux_mem指针的构造函数?

 rowvec a(x.pointer, x.size()); 

答案 3 :(得分:0)

尝试类似

的内容
vector<int> x = foo();
vector<int>::const_iterator iter2;
stringstream buffer;
for(iter2 = x.begin(); iter2 != x.end(); ++iter2) 
{
   buffer  << *iter << " ";    
}
// To remove the extra trailing space, not sure if it is needed or not
string elements = buffer.str().substr(0,buffer.str().length()-1);

rowvec a = rowvec(elements.c_str());

根据Armadillo Documentation rowvec的构造函数将使用arma :: rowvec,arma :: mat,字符串(读取const char *)或初始化列表(如果您使用的是C ++ 11)。