在 C++ Armadillo 中,push_back/append 或用循环附加向量

2023-11-25

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

 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 分配给向量的第一个元素,但如果需要的话可以接受。

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


向向量重复添加元素是真是个坏主意从性能的角度来看,因为它可能会导致重复的内存重新分配和复制。

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

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

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

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

作为旁注,你的foo(arma::vec x)已经对输入向量进行了不必要的复制。 C++ 中的参数默认传递by value,这基本上意味着 C++ 将复制x在运行你的函数之前。为了避免这种不必要的复制,请将您的函数更改为foo(const arma::vec& x), 意思是持续参考 to x. The &这里很关键。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ Armadillo 中,push_back/append 或用循环附加向量 的相关文章

随机推荐