omp redução no vetor de cv :: Mat ou cv :: Mat em geral

//In other words, this equilavent to cv::Mat1f mat(5,n)
//i.e. a matrix 5xn
std::vector<cv::Mat1f> mat(5,cv::Mat1f::zeros(1,n));
std::vector<float> indexes(m);
// fill indexes
// m >> nThreads (from hundreds to thousands)
for(size_t i=0; i<m; i++){
  mat[indexes[m]] += 1;
}

O resultado esperado é aumentar cada elemento de cada linha em um. Este é um exemplo de brinquedo, a soma real é muito mais complicada. Eu tentei paralelizar com:

#pragma omp declare reduction(vec_float_plus : std::vector<cv::Mat1f> : \
            std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<cv::Mat1f>())) \
            initializer(omp_priv=omp_orig);

#pragma omp parallel for reduction(vec_float_plus : mat)
for(size_t i=0; i<m; i++){
    mat[indexes[m]] += 1;
}       

Mas isso falha porque cada elemento de cada linha é inicializado aleatoriamente. Como posso resolver isso?

Então eu descobri que o problema está relacionado aesta. Então eu deveria inicializarmat com:

std::vector<cv::Mat1f> mat(5);
for(size_t i=0; i<mat.size(); i++)
  mat[i] = cv::Mat1f::zeros(1,n);

Mas isso criaria problemas comomp_priv = omp_orig, pois considerariastd::vector<cv::Mat1f> mat(5); e seus valores são indefinidos. Como posso resolver isso? A única solução que me veio à mente é criar uma estrutura de wrapper, algo como:

class vectMat{
public:
    vectMat(size_t rows, size_t j){
        for(size_t i=0; i<rows; i++)
            mats.push_back(cv::Mat1f::zeros(1,j));
    }
private:
    std::vector<cv::Mat1f> mats;
};

Mas então o que devo implementar para fazê-lo funcionar com o restante do código?

questionAnswers(1)

yourAnswerToTheQuestion