c – 计算矩阵向量的列和与迭代器?

前端之家收集整理的这篇文章主要介绍了c – 计算矩阵向量的列和与迭代器?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在之前的 column vector with row means — with std::accumulate?帖子中,我询问是否可以使用STL功能来计算矩阵的行均值
  1. vector< vector<double> > data ( rows,vector<double> ( columns ) );

@benjaminlindley的最佳答案不仅仅是我所寻找的,它还是一件美丽的事情.永远充满希望我认为计算列方法会很容易,所以STL相当于

  1. vector<double> colmeans( data[0].size() );
  2. for ( int i=0; i<data.size(); i++ )
  3. for ( int j=0; j<data[i].size(); j++ )
  4. colmeans[j] += data[i][j]/data.size();

其中均值不是在每个向量< double>内计算的,而是在所有向量中的相同索引中计算:

  1. colmeans[0] == ( data[0][0] + data[1][0] + ... data[rows][0] ) / rows
  2. colmeans[1] == ( data[0][1] + data[1][1] + ... data[rows][1] ) / rows
  3. colmeans[2] == ( data[0][2] + data[1][2] + ... data[rows][2] ) / rows
  4. ...
  5. colmeans[columns] == ( data[0] [columns] +
  6. data[1] [columns] +
  7. ...
  8. data[rows][columns] ) / rows

事实证明它是完全不同的 – 累积不想对矢量矢量起作用.是否可以使用[]运算符累积?我甚至无法想出一个中间形式(为了摆脱i或j循环),这似乎是不对的.

有积累和[]运算符的东西?还是绑定?

解决方法

这是我想出来的东西,使用for_each和transform:
  1. std::vector<std::vector<double>> data { {1,2,3},{1,3} };
  2.  
  3. std::vector<double> colsums( data[0].size() ); // initialize the size
  4. // to number of columns
  5.  
  6. std::for_each(data.begin(),data.end(),[&](const std::vector<double>& row)
  7. {
  8. // Use transform overload that takes two input ranges.
  9. // Note that colsums is the second input range as well as the output range.
  10. // We take each element of the row and add it to the corresponding
  11. // element of colsums vector:
  12. std::transform(row.begin(),row.end(),colsums.begin(),[](double d1,double d2) { return d1 + d2; });
  13. });
  14.  
  15. std::cout << "Column means: ";
  16. std::transform(
  17. colsums.begin(),colsums.end(),std::ostream_iterator<double>(std::cout," "),[&data](double d) { return d / data.size(); });

LWS Demo

猜你在找的C&C++相关文章