メモリ構造を考えるとそれはそう、という話なんですが、こういうコードを書くと実行時間に差が出ます。
cv::TickMeter ticks; ticks.start(); for (int i = 0; i < 1000; ++i) { const auto m = cv::mean(mat.row(i))[0]; } ticks.stop(); std::cout << ticks << std::endl; ticks.reset(); ticks.start(); for (int i = 0; i < 1000; ++i) { const auto m = cv::mean(mat.col(i))[0]; // ここの処理はなんでもいい (この例だとreduceで良くなっちゃうけど) } ticks.stop(); std::cout << ticks << std::endl;
0.0058812sec // mat.row 0.343708sec // mat.col
ずっと一次元のデータと戯れてきたため二次元とか行列は知見がなくて、こういう時どうするのが良いんでしょう。transposeしちゃう?
cv::transpose(mat, mat); for (int i = 0; i < 1000; ++i) { const auto m = cv::mean(mat.row(i))[0]; }