我正在创建一些函数来执行像负数和正数的“分离求和”,kahan,成对等其他操作,其中从矩阵中取元素的顺序并不重要,例如:
template <typename T, int R, int C>
inline T sum(const Eigen::Matrix<T,R,C>& xs)
{
T sumP(0);
T sumN(0);
for (size_t i = 0, nRows = xs.rows(), nCols = xs.cols(); i < nRows; ++i)
for (size_t j = 0; j < nCols; ++j)
{
if (xs(i,j)>0)
sumP += xs(i,j);
else if (xs(i,j)<0) //ignore 0 elements: improvement for sparse matrices I think
sumN += xs(i,j);
}
return sumP+sumN;
}
现在,我希望尽可能地提高效率,所以我的问题是,是像上面那样循环遍历每一行的每一列更好,还是像下面这样做相反的操作:
for (size_t i = 0, nRows = xs.rows(), nCols = xs.cols(); i < nCols; ++i)
for (size_t j = 0; j < nRows; ++j)
我认为这取决于矩阵元素在内存中分配的顺序,但我在Eigen的手册中找不到相关信息。此外,是否有其他替代方法(例如使用迭代器,Eigen是否支持?),可能会更快一些?
T * xsBegin = xs.data();
,因为 g++ 输出了一些关于模板的错误信息,结果发现我只是漏了一个 const:const T * xsBegin = xs.data();
。 - random_userfor (size_t i = 0, size = xs.size(); i < size; i++) { }
类似于{size_t i = 0, size = xs.size(); for (; i < size; i++) { } }
。 - random_user