【发布时间】:2013-02-17 19:08:39
【问题描述】:
在之前的帖子column vector with row means -- with std::accumulate? 中,我询问是否可以使用 STL 功能来计算矩阵的行均值
vector< vector<double> > data ( rows, vector<double> ( columns ) );
@benjaminlindley 的最佳答案不仅是我在寻找的东西,而且是一件美丽的事情。永远充满希望,我认为计算列均值会很容易,所以 STL 相当于
vector<double> colmeans( data[0].size() );
for ( int i=0; i<data.size(); i++ )
for ( int j=0; j<data[i].size(); j++ )
colmeans[j] += data[i][j]/data.size();
平均值不是在每个 vector<double> 内计算,而是在所有向量中的相同索引中计算:
colmeans[0] == ( data[0][0] + data[1][0] + ... data[rows][0] ) / rows
colmeans[1] == ( data[0][1] + data[1][1] + ... data[rows][1] ) / rows
colmeans[2] == ( data[0][2] + data[1][2] + ... data[rows][2] ) / rows
...
colmeans[columns] == ( data[0] [columns] +
data[1] [columns] +
...
data[rows][columns] ) / rows
结果完全不同——accumulate 不想处理向量的向量。是否可以通过 [] 运算符使用累积?我什至无法想出一个看起来不正确的中间形式(摆脱for i 或for j 循环)。
accumulate 和 [] 运算符?还是bind?
【问题讨论】:
-
如果您认为 Benjamin 的回答很好(顺便说一句,确实如此),您应该将其标记为已接受。
-
老实说,这其中最困难的部分将是您的外向量向量中的潜在短向量。这是使用
vector<vector<type>>时的基本问题。不能保证每个内部向量的大小相同(当然,除非在您自己的代码中假设它,这首先会填充这个东西)。查找行均值时这不是问题,因为您并不真正关心有多少列。 -
所以@WhozCraig 你是说找到列均值时有问题吗?顺便说一句,满足内部向量大小相同的保证,初始化后不会改变——
data基本上是rowsxcolumns的矩阵 -
@alle_meije 我的意思是选择的数据模型(向量的向量)允许任何给定行不一定具有与其他行相同的列数的意外可能性行。这是一个数据模型问题,而不是矩阵问题。只要您强制每行在代码中具有相同的列数(如注释),就可以了。
-
要让
std::accumulate用于此目的,您必须实现自己的特殊迭代器,它可以跨向量跳转,这比简单地使用 for 循环要多得多。您可能可以在外部库(如 boost)中找到简单的解决方案,但在标准库中找不到。
标签: c++ vector stl mean accumulate