c++ - push_back/append 或在 C++ Armadillo 中附加带有循环的 vector

标签 c++ armadillo

我想创建一个整数 vector (arma::uvec) - 我事先不知道 vector 的大小。我在 Armadillo 文档中找不到合适的函数,而且我没有成功地通过循环创建 vector 。我认为问题在于初始化 vector 或跟踪其长度。

 arma::uvec foo(arma::vec x){
 arma::uvec vect;
 int nn=x.size();
 vect(0)=1;
 int ind=0;
 for (int i=0; i<nn; i++){
     if ((x(i)>0)){
        ind=ind+1;
        vect(ind)=i;
     }
 }
   return vect;
}

错误信息是:Error: Mat::operator(): index out of bounds.

我不想将 1 分配给 vector 的第一个元素,但如果需要的话可以接受。

PS:我真的很想知道如何通过附加获得未知长度的 vector ,这样我就可以在更一般的情况下使用它。

最佳答案

从性能的角度来看,重复将元素附加到 vector 是一个非常糟糕的主意,因为它会导致重复的内存重新分配和复制。

对此有两个主要的解决方案。

  1. 将 vector 的大小设置为操作的理论最大长度(在本例中为 nn),然后使用循环设置 vector 中的一些值。到目前为止,您需要为 vector 中集合元素的数量保留一个单独的计数器。循环后,使用 .head() 获取 vector 的子 vector 功能。这样做的好处是只有一份。

  2. 另一种解决方案是使用两个循环来减少内存使用。在第一个循环中计算出 vector 的最终长度。然后将 vector 的大小设置为最终长度。在第二个循环中设置 vector 中的元素。显然,使用两个循环的效率低于一个循环,但很可能这仍比追加快得多。

如果您仍然想成为一个懒惰的编码员并且低效地附加元素,请使用 .insert_rows()功能。

作为旁注,您的 foo(arma::vec x) 已经对输入 vector 进行了不必要的复制。 C++ 中的参数默认通过按值 传递,这基本上意味着 C++ 将在运行您的函数之前制作一份 x 的拷贝。为避免这种不必要的复制,请将您的函数更改为 foo(const arma::vec& x),这意味着获取对 x 的常量引用& 在这里很关键。

关于c++ - push_back/append 或在 C++ Armadillo 中附加带有循环的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28247490/

相关文章:

opencv - 将 OpenCV 库与 Armadillo 库结合使用的最佳方法是什么?

c++ - 在 Armadillo 库中引用 vector 的最快方法

c++ - 在类中使用 Armadillo 矩阵

c++ - C++ (GCC) 中的 C99 严格别名规则

c++ - gen~ phasor() 是做什么的? (将 Max/MSP gen 转换为 C++)

c++ - 从 zip 文件中提取文件夹

c++ - 用于谷歌云消息传递的 QNetworkAccessManager

c++ - 在 C++ 中每次都返回 false

c++ - Armadillo vector 矩阵乘法

gcc - 将 Armadillo lapack blas 链接到代码 : undefined reference to `dtrsm_ ' 时出错