負の数と正の数の「分離された合計」、カハン、ペアワイズ、およびマトリックスから要素を取得する順序が問題にならないその他のもののようなことを行う関数をいくつか作成しています。次に例を示します。
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 には存在しますか?)、少し高速になる可能性がありますか?