当前位置:  开发笔记 > 编程语言 > 正文

C++ Armadillo:使用迭代器进行双循环

如何解决《C++Armadillo:使用迭代器进行双循环》经验,为你挑选了1个好方法。

在双for循环中使用迭代器的最佳方法是什么.对于单循环,显而易见的方式似乎是:

arma::vec test = arma::ones(10);
for(arma::vec::iterator i = test.begin(); i != test.end(); ++i){
   int one = *i;
}

所以我想改变以下内容:

arma::mat test = arma::ones(10,10);
for (int i = 0; i < test.n_rows; i++){
 for (int j = 0; j < test.n_cols; j++){
  int one = test(i,j);
 }
}

使用迭代器而不是整数索引.谢谢你的建议.



1> hbrerkere..:

当访问矩阵中的元素时,建议仍然使用单个循环.Armadillo以列主格式存储数据(为了与LAPACK兼容),因此迭代器将沿着矩阵中的每一列传播.

arma::mat A(4, 5, arma::fill::randu);
A.print("A:");

// C++98 

arma::mat::iterator it_end = A.end();

for(arma::mat::iterator it = A.begin(); it != it_end; ++it)
   {
   std::cout << (*it) << std::endl;
   }

// C++11

for(const auto& val : A)
   {
   std::cout << val << std::endl;
   }

如果你真的想使用双循环,请使用.begin_col()和.end_col():

// C++11

for(arma::uword c=0; c < A.n_cols; ++c)
  {
  auto it_end = A.end_col(c);

  for(auto it = A.begin_col(c); it != it_end; ++it)
    {
    std::cout << (*it) << std::endl;
    }
  }

最后,.for_each()函数是使用迭代器的替代方法:

 // C++11

 A.for_each( [](arma::mat::elem_type& val) { std::cout << val << std::endl; } );

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有