我有一个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;
,那么我只获得最后一个元素。
答案 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)。